【问题标题】:Converting a matrix in MATLAB在 MATLAB 中转换矩阵
【发布时间】:2010-10-24 17:56:29
【问题描述】:

假设我有一个向量a = [1 2 4]。我希望它转换成一个看起来像这样b = [1 2 0 4] 的向量,即每个数字都放置在正确的位置,并且由于3 不包含在向量a 中,它被向量@987654326 中的0 替换@。这可以通过以下方式完成:

a = [1 2 4]
b = zeros(1, size(a, 2));
b(1, a) = a;

我想不出一种方法来对矩阵做同样的事情。例如,

c = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0];

我需要转换成如下所示的矩阵:

d = [1 2 0 4; 1 0 3 0; 0 0 0 4; 1 0 3 4];

有什么建议吗?如何才能做到这一点?如何在不使用循环的情况下做到这一点?

【问题讨论】:

  • 如何 b = zeros(1, size(a, 2)); a(1, b) = b;实现你要求的改变?
  • 对不起,我的错误。以上已更正。

标签: matlab matrix


【解决方案1】:

这是一个矢量化的解决方案:

a = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0];
b = zeros(size(a,1),max(a(:)));
[rowIdx,~] = find(a);
vals = a(a>0);
b( sub2ind(size(b),rowIdx,vals) ) = vals;

【讨论】:

    【解决方案2】:

    这行得通吗? (已编辑:修正错误。)

    [m,n] = size(c)
    d = zeros(m,n)
    for i=1:m
        d(i,c(i,c(i,:)>0)) = c(i,c(i,:)>0)
    end
    

    【讨论】:

    • 有没有办法在不使用循环的情况下做到这一点?我正在处理非常大的数据集,并且循环往往很慢......
    • 我认为这是可能的,但在这种情况下,您对每一行都执行相同的操作,因此它会遍历每一行。即使对于大型矩阵,我也不认为循环会使过程变得异常缓慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多