根据条件替换矩阵元素
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)<5
。 x( condition ) = value;
之类的命令可用于告诉 MATLAB 让 x
为 value
,其中 condition
为真。这称为逻辑索引。
同样的效果可以用for循环来实现,对于懂一些编程语言但不懂MATLAB的人来说更容易阅读,但是for循环通常比逻辑索引慢。另一种方法是使用 find
函数首先找到条件 (a.*b)<5
为真的 b
的索引,然后将这些索引替换为所需的值。这也比逻辑索引慢,并且需要更多代码。
我有以下示例(不起作用!)
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)<5
。 x( condition ) = value;
之类的命令可用于告诉 MATLAB 让 x
为 value
,其中 condition
为真。这称为逻辑索引。
同样的效果可以用for循环来实现,对于懂一些编程语言但不懂MATLAB的人来说更容易阅读,但是for循环通常比逻辑索引慢。另一种方法是使用 find
函数首先找到条件 (a.*b)<5
为真的 b
的索引,然后将这些索引替换为所需的值。这也比逻辑索引慢,并且需要更多代码。