我有以下示例(不起作用!)
a(1, 1:2, 1:2) = [1 2; 3 4];
a(2, 1:2, 1:2) = [5 6; 7 8];
b=a;
for i=1:2
b(a(i,:,:).*b(i,:,:) < 5.0) = 3*circshift(a(i,:,:), [1 0]);
end
因此,我们的想法是a(i,:,:).*b(i,:,:)
小于5的所有地方b(i,:,:)
应该在该地点获得3*circshift(a, [1 0])
的值。这可能吗?
我当然可以使用一堆for
- 循环,但这似乎不是最佳解决方案。
答案 0 :(得分:2)
可以使用以下方法:
b( (a.*b)<5 ) = [value you want];
应用于您的代码:
a(1, 1:2, 1:2) = [1 2; 3 4];
a(2, 1:2, 1:2) = [5 6; 7 8];
b=a;
c = 3*circshift( a( (a.*b)<5 ), [1 0]); % first change a
b( (a.*b)<5 ) = c( (a.*b)<5 ); % then store c where (a.*b)<5 in b where (a.*b)<5
请注意,我在(a.*b)<5
中使用了a( (a.*b)<5 )
。像x( condition ) = value;
这样的命令可以用来告诉MATLAB让x
为value
,其中condition
为真。这称为逻辑索引。
使用for循环可以实现相同的效果,对于了解某些编程语言但不熟悉MATLAB的人来说,这可能更容易阅读,但for循环通常比逻辑索引慢。另一种方法是使用find
函数首先找到条件b
为真的(a.*b)<5
索引,然后用期望值替换这些索引。这也比逻辑索引慢,并且需要更多代码。