在两组条件下简化循环

时间:2015-08-05 04:11:33

标签: matlab loops controls indices

我想建立一对index = [row col]其中

row = 4 * (n-1) + icol = 4 * (m-1) + i

imn的说明:

对于n = 1m = 2, 3, 4,循环i = 1 : 4

对于n = 2m = 1,循环i = 1 : 4

对于n = 3m = 5,循环i = 1 : 4

结果应该是:

row = [1 1 1 2 2 2 3 3 3 4 4 4 5 6 7 8 9 10 11 12]

col = [5 9 13 6 10 14 7 11 15 8 12 16 1 2 3 4 17 18 19 20]

也就是说,我想在不同的n-m条件下建立索引对。

我的试用版:

row = []; col = [];
n = 1;
for i = 1 : 4
   for m = [2 3 4]
      row = [row 4 * (n - 1) + i];
      col = [col 4 * (m - 1) + i];
   end
end

n = 2; m = 1;
for i = 1 : 4
   row = [row 4 * (n - 1) + i];
   col = [col 4 * (m - 1) + i];
end

n= 3; m = 5;
for i = 1 : 4
   row = [row 4 * (n - 1) + i];
   col = [col 4 * (m - 1) + i];
end

这确实有效,但确实我有很多n-m条件,i = 1 : 4的循环重复出现,似乎可以简化。

我是否知道是否有任何优雅的解决方案可以完成我的目标?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以针对所有这三种情况使用基于bsxfun的解决方案 -

ii = 1:4
row = reshape(bsxfun(@(A,B) 4 * (B-1) + A,ii,n'),1,[])  %//'
col = reshape(bsxfun(@(A,B) 4 * (B-1) + A,ii,m'),1,[])  %//'

输入将如下所示。

案例#1:

m = [2, 3, 4]
n = ones(1,numel(m))

案例#2:

n = 2
m = 1

案例#3:

n = 3
m = 5

答案 1 :(得分:1)

我会创建一个包含所有参数的矩阵,然后应用数学一次:

M=[...n           m           i
      ones(3,1)   (2:4).'     (1:3).';...
      2*ones(4,1) ones(4,1)   (1:4).';...
      3*ones(4,1) 5*ones(4,1) (1:4).';...
];

row = (4 * (M(:,1) - 1) + M(:,3)).';
col = (4 * (M(:,2) - 1) + M(:,3)).';
%alternative:
%index=(4 * (M(:,[1:2]) - 1) + M(:,[3,3])).'