我有两个输入变量:
N=10;
M=4;使用Matlab,我希望生成以下矩阵--而不使用for循环,用于任何M和N:
%N = 1 2 3 4 5 6 7 8 9
Mat1 = [2, 3, 4, 5, 6, 7, 8, 9, 10; %M=1 -> Mat1(1, i) = N(i)+1
3, 6, 9, 12, 15, 18, 21, 27, 30; %M=2 -> Mat1(2, i) = N(i)+N(i)*2
4, 8, 12, 16, 20, 24, 28, 32, 36; %M=3 -> Mat1(2, i) = N(i)+N(i)*3
5, 10, 15, 20, 25, 30, 35, 40, 45] %M=4 -> Mat1(2, i) = N(i)+N(i)*4
%N = 1 2 3 4 5 6 7 8 9
Mat2 = [1, 2, 3, 4, 5, 6, 7, 8, 9; %M=1 -> Mat2(2, i) = N(i)
1, 4, 7, 10, 13, 16, 19, 25, 28; %M=2 -> Mat2(2, i) = N(i)+N(i)*2-2
1, 5, 9, 13, 17, 21, 25, 29, 33; %M=3 -> Mat2(2, i) = N(i)+N(i)*3-3
1, 6, 11, 16, 21, 26, 31, 36, 41] %M=4 -> Mat2(2, i) = N(i)+N(i)*4-4一般描述: % i=1:N %Mat1(M,i) = N( i) + N(i) *M,若M>1 % N(i)+1,若M=1 %Mat2(M,I)=N(I)+N(I)*M,若M>1 %N(I),若M=1
我编写了一个包含两个for循环的代码,但是我想问一下是否有任何方法可以不使用循环来获得这些结果。我尝试过使用bsxfun和arrayfun,但没有得到正确的结果:
clear Mat1 Mat2
N=10;
M=9;
Mat1 = ones(M, N);
Mat2 = ones(M, N);
for i=1:M
for j=1:N
if i==1
Mat1(i, j) = j+1;
Mat2(i, j) = j;
elseif j ==1
Mat1(i, j) = j+j*i;
elseif i~=1 && j~=1
Mat1(i, j) = j+j*i;
Mat2(i, j) = j+j*i-i;
end
end
end谢谢
发布于 2013-02-21 10:34:13
我的尝试:
N=10;
M=4;
mat1 = bsxfun(@(x,y) x*(y.*(y>1)+1)+(y==1), 1:N,(1:M)')
mat2 = bsxfun(@(x,y) x*(y.*(y>1)+1)-(y>1).*y, 1:N,(1:M)')发布于 2013-02-20 11:26:55
我认为这可能会达到你想要的结果:
第一汇总表:
Mat1 = (2:N+1)'*(1:N);
Mat1 = Mat1(1:M,:);
Mat1(1,:) = 2:N+1;这给出(N=10,M=4):
Mat1 =
2 3 4 5 6 7 8 9 10 11
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50第二汇总表:
tmp = (0:N-2)'*(1:N-1);
Mat2 = repmat((4:3:3*N),M-1,1) + tmp(1:M-1,:);
Mat2 = [ones(M,1), [2:N; Mat2]];这意味着:
Mat2 =
1 2 3 4 5 6 7 8 9 10
1 4 7 10 13 16 19 22 25 28
1 5 9 13 17 21 25 29 33 37
1 6 11 16 21 26 31 36 41 46这有点令人费解,因为目前还不太清楚构建这些矩阵的具体规则是什么。但是如果仅仅是你想要的矩阵,这应该是快速获取它们的方法。
对于所有的N和M,这些代码行生成与使用for循环的代码相同的矩阵。
发布于 2013-02-21 09:36:31
同时,我学会了如何使用bsxfun和repmat。我为Mat1和Mat2生成器编写了一个紧凑的代码:
N=10;
M=4;
Mat1 = bsxfun(@times, (1:M)', (1:N)) +...
[ones(1, N) ; horzcat( ones(M-1,1) , repmat(2:N,M-1,1) ) ];
Mat2 = [ones(M,1), [(2:N); bsxfun(@plus, (2:M)',(2:N)) +...
horzcat( zeros(M-1,1), bsxfun(@times, (2:M)',(1:N-2)) ) ] ];Mat1 = 2 3 4 5 6 7 8 9 10 11 3 6 12 18 21 24 27 30 4 12 16 20 24 32 36 40 5 10 20 25 30 35 40 45 50 Mat2 = 1 2 3 4 5 6 7 8 10 10 1 7 10 13 16 19 22 28 1 5 9 17 21 29 33 37 6 11 21 26 31 36 41 46
https://stackoverflow.com/questions/14977199
复制相似问题