n = 10; % 广告数 m = 6; % 广告位数 s = rand(n,m)*10; % 打分值 k = floor(rand(1,m)*3)+1; % 每个广告位需要选取的广告数 % 构造约束矩阵和目标函数系数矩阵 Aeq = zeros(m,n*m); beq = k'; f = -reshape(s',[1 n*m]); for i = 1:n idx = (i-1)*m+1:i*m; Aeq(:,idx) = ones(m,1).*[zeros(1,(i-1)*m) 1 zeros(1,n*m-i*m)]; end % 设置不等式约束 lb = zeros(n*m,1); ub = ones(n*m,1); % 调用线性规划函数求解 [x,fval] = linprog(f,[],[],Aeq,beq,lb,ub); % 显示结果 x_mat = reshape(x,[m,n])'; disp(x_mat) disp(['Total score: ',num2str(-fval)]) Error using .* Matrix dimensions must agree.
时间: 2024-03-13 11:44:38 浏览: 65
这个错误提示出现的原因是矩阵的维度不一致,导致无法进行矩阵运算。具体来说,出现这个错误的原因是在设置约束矩阵 Aeq 时,使用了 .* 运算符对一个大小为 (m,1) 的矩阵和一个大小为 (1,n\*m) 的矩阵进行了相乘操作,导致维度不一致,无法进行运算。
要解决这个问题,你可以将 .* 运算符替换为 * 运算符,这样就可以进行矩阵乘法,而不是逐元素相乘。修改后的代码如下:
```matlab
n = 10; % 广告数
m = 6; % 广告位数
s = rand(n,m)*10; % 打分值
k = floor(rand(1,m)*3)+1; % 每个广告位需要选取的广告数
% 构造约束矩阵和目标函数系数矩阵
Aeq = zeros(m,n*m);
beq = k';
f = -reshape(s',[1 n*m]);
for i = 1:n
idx = (i-1)*m+1:i*m;
Aeq(:,idx) = ones(m,1)*[zeros(1,(i-1)*m) 1 zeros(1,n*m-i*m)];
end
% 设置不等式约束
lb = zeros(n*m,1);
ub = ones(n*m,1);
% 调用线性规划函数求解
[x,fval] = linprog(f,[],[],Aeq,beq,lb,ub);
% 显示结果
x_mat = reshape(x,[m,n])';
disp(x_mat)
disp(['Total score: ',num2str(-fval)])
```
这样就可以避免这个错误了。
相关问题
n = 10; % 广告数 m = 6; % 广告位数 s = rand(n,m)*10; % 打分值 k = floor(rand(1,m)*3)+1; % 每个广告位需要选取的广告数 % 构造约束矩阵和目标函数系数矩阵 Aeq = zeros(m,n*m); beq = k'; f = -reshape(s',[1 n*m]); for i = 1:n idx = (i-1)*m+1:i*m; Aeq(:,idx) = ones(m,1)*[zeros(1,(i-1)*m) 1 zeros(1,n*m-i*m)]; end % 设置不等式约束 lb = zeros(n*m,1); ub = ones(n*m,1); % 调用线性规划函数求解 [x,fval] = linprog(f,[],[],Aeq,beq,lb,ub); % 显示结果 x_mat = reshape(x,[m,n])'; disp(x_mat) disp(['Total score: ',num2str(-fval)]) Subscripted assignment dimension mismatch.
这个错误提示出现的原因是在进行矩阵转置时,维度不一致导致无法进行赋值操作。具体来说,出现这个错误的原因是在显示结果时,使用了一个大小为 (n\*m,m) 的矩阵进行矩阵转置,转置后得到的矩阵大小为 (m,n\*m),然后尝试将其赋值给一个大小为 (n,m) 的矩阵,导致维度不一致,无法进行赋值操作。
要解决这个问题,你需要将矩阵转置的位置进行调整,使其转置后的大小为 (n,m)。修改后的代码如下:
```matlab
n = 10; % 广告数
m = 6; % 广告位数
s = rand(n,m)*10; % 打分值
k = floor(rand(1,m)*3)+1; % 每个广告位需要选取的广告数
% 构造约束矩阵和目标函数系数矩阵
Aeq = zeros(m,n*m);
beq = k';
f = -reshape(s',[1 n*m]);
for i = 1:n
idx = (i-1)*m+1:i*m;
Aeq(:,idx) = ones(m,1)*[zeros(1,(i-1)*m) 1 zeros(1,n*m-i*m)];
end
% 设置不等式约束
lb = zeros(n*m,1);
ub = ones(n*m,1);
% 调用线性规划函数求解
[x,fval] = linprog(f,[],[],Aeq,beq,lb,ub);
% 显示结果
x_mat = reshape(x,[m,n]);
x_mat = x_mat'; % 转置
disp(x_mat)
disp(['Total score: ',num2str(-fval)])
```
这样就可以避免这个错误了。
有个四位数ABCD和一位数E,两数相乘得到四位数ABCD的倒置,即DCBA.且A、B、C、D、E代表的数字各不相同,编程表示出A、B、C、D、E各代表什么数字。【原代码部分】int is(int m,int n){int a,b,c,d;a=m%10;b=m%100/10;c=m%1000/100;d=m/1000;if(a!=b&&a!=c&&a!=d&&a!=n&&b!=c&&b!=d&&b!=n&&c!=d&&c!=n&&d!=n)return 1;return 0;}int r(int m){int r=0;while(m){r=r*10+m%10;m/=10;}return r;}main(){【 】;for(m=1000;m<=9999;m++)for(n=1;n<=9;n++){k=r(m);if(n*m==k&&is(m,n)) printf("ABCD=%d,E=%d\n",m,n);}}请补全上述代码
完整代码如下:
```
#include <stdio.h>
int is(int m, int n) {
int a, b, c, d;
a = m % 10;
b = m % 100 / 10;
c = m % 1000 / 100;
d = m / 1000;
if (a != b && a != c && a != d && a != n && b != c && b != d && b != n && c != d && c != n && d != n)
return 1;
return 0;
}
int r(int m) {
int r = 0;
while (m) {
r = r * 10 + m % 10;
m /= 10;
}
return r;
}
int main() {
int m, n;
for (m = 1000; m <= 9999; m++) {
for (n = 1; n <= 9; n++) {
int k = r(m);
if (n * m == k && is(m, n))
printf("ABCD=%d,E=%d\n", m, n);
}
}
return 0;
}
```
输出结果:
```
ABCD=2178,E=4
```
阅读全文