根据条件替换矩阵元素

substituting matrix elements based on condition

我有以下示例(不起作用!)

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 循环来完成,但这似乎不是最佳解决方案。

这可以使用以下方法:

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( (a.*b)<5 ) 中使用了 (a.*b)<5x( condition ) = value; 之类的命令可用于告诉 MATLAB 让 xvalue,其中 condition 为真。这称为逻辑索引。

同样的效果可以用for循环来实现,对于懂一些编程语言但不懂MATLAB的人来说更容易阅读,但是for循环通常比逻辑索引慢。另一种方法是使用 find 函数首先找到条件 (a.*b)<5 为真的 b 的索引,然后将这些索引替换为所需的值。这也比逻辑索引慢,并且需要更多代码。