【问题标题】:Matrix Block indexing plus mask in matlabmatlab中的矩阵块索引加掩码
【发布时间】:2014-04-10 18:14:02
【问题描述】:

我想使用逻辑掩码索引矩阵的一部分。因此,作为输入,我有一个矩阵 A,其中有一些 nan 值,我为此使用 isnan 创建了一个 mask。此外,我有一个向量 v 的值,我想插入到 A A(mask)=v 中。然后我使用 A B=[A;A;A] 构造另一个矩阵 B。现在我想将v 中的值应用到B 中的正确位置。如何在 Matlab 中做到这一点而不创建 temp=B(1:size(A,1),1:size(A,2)) 矩阵或创建新的 mask=[mask;false(2*size(A,1),size(A,2))]

再来一次:

A = rand(2,10);
v = A(A>0.5);
A(A>0.5) = nan;
mask = isnan(A);
B=[A;A;A];

% now how to write v to B?
% not doing one of those: 

tmp = B(1:2,:);
tmp(mask) = v;
B(1:2,:) = tmp;

%...

mask1 = [mask;false(4,10)]

mask2 = [false(2,10);mask;false(2,10)]

mask3 = [false(4,10);mask]

B(mask1) = v;
B(mask2) = v;
B(mask3) = v;

% what i miss is something like B(1:2,:)(mask) 

【问题讨论】:

    标签: matlab matrix mask


    【解决方案1】:

    我假设您想在B 内的三个A 的每一个处填充值。

    如果您不介意重复矢量v

    B = repmat(A.',1,3); % easier to work by columns
    B(bsxfun(@plus,find(mask.'),(0:2)*numel(A))) = v(repmat(1:numel(v),1,3)); % fill
    B = B.'; % transpose back
    

    【讨论】:

    • 谢谢,您的回答解决了我的问题,或者至少给了我一个很好的发展方向。我的问题是性能。 B 是一个大矩阵,写操作B(mask)=v 经常进行。而且B就是B=[A(:,4:end);A(:,3:end-1);A(:,2:end-2)]
    【解决方案2】:

    不确定我是否正确理解了您的措辞,但如果您将这些行放在最后:

    mask2 = repmat(mask, 3, 1);
    B(mask2) = NaN
    

    它将垂直重复 NaN 值 3 次。这取决于您所说的“将 v 中的值应用到 B 中的正确位置”的意思

    【讨论】:

    • 谢谢,但它不能解决我想问的问题。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2018-03-26
    • 2011-12-24
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2014-05-12
    • 2013-09-13
    相关资源
    最近更新 更多