基于条件替代矩阵元素

时间:2015-03-25 14:18:10

标签: matlab vector element

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

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

1 个答案:

答案 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让xvalue,其中condition为真。这称为逻辑索引。

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