简化两组条件下的循环
Simplify the looping under two sets of conditions
我想建立一对索引=[row col]
where
row = 4 * (n-1) + i
和 col = 4 * (m-1) + i
i
、m
和 n
的解释:
对于n = 1
和m = 2, 3, 4
,循环i = 1 : 4
。
对于n = 2
和m = 1
,循环i = 1 : 4
。
对于n = 3
和m = 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
的循环重复出现,这似乎可以简化。
我可以知道是否有任何优雅的解决方案来完成我的 objective?
感谢您的帮助。
我会创建一个包含所有参数的矩阵,然后应用数学一次:
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])).'
您可以对所有这三种情况使用基于 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
我想建立一对索引=[row col]
where
row = 4 * (n-1) + i
和 col = 4 * (m-1) + i
i
、m
和 n
的解释:
对于n = 1
和m = 2, 3, 4
,循环i = 1 : 4
。
对于n = 2
和m = 1
,循环i = 1 : 4
。
对于n = 3
和m = 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
的循环重复出现,这似乎可以简化。
我可以知道是否有任何优雅的解决方案来完成我的 objective?
感谢您的帮助。
我会创建一个包含所有参数的矩阵,然后应用数学一次:
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])).'
您可以对所有这三种情况使用基于 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