【问题标题】:How to avoid for loop in Matlab when building a new matrix from a database从数据库构建新矩阵时如何避免Matlab中的for循环
【发布时间】:2018-11-18 12:34:55
【问题描述】:

我有一个包含两列大约 500 行的矩阵。第一列的值从 1 到 48 不等。这意味着第一列中有重复的数字。 我需要构建一个有 48 行的新矩阵,每行包含第 1 列中特定数字的信息。例如考虑以下数据:

x = [ 3 500
5 400
3 200
1 100
1 1100 
2 450 
3 890
1 110
2 800
....]

所以,输出矩阵应该是:

Output = [100 1100 110 ...0 0 0; 450 800 ... 0 0 0; 8200 890 0 0 0 ...; 0 0 0];

我知道如何使用 for 循环来完成,但我需要在没有 for 循环的情况下完成。

我使用了以下几行

XX = X(:,2);

Output = XX(X(:,1)==(1:48)');

但是没有用,因为新矩阵的行数不一样。

感谢任何帮助。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您可以使用 sub2ind 函数执行此操作,我建议您阅读文档以了解其工作原理。我们将所有 x(:,2) 值放入矩阵 M。每个值所属的行取决于 x(:,1) 值,因此我们必须确定该值属于哪一列。

    计算下面的 j 使得 j(k) 等于 x(k,1) 在向量 x(1:k,1) 中出现的次数。这将是我们想要将值 x(k,2) 放入的列。

    x = [ 3 500
    5 400
    3 200
    1 100
    1 1100 
    2 450 
    3 890
    1 110
    2 800];
    
    j = sum(triu(x(:,1)==x(:,1)'));     % Calculate the column each value should be placed into
    M = zeros(max(x(:,1)), max(j));   % Set up the empty matrix
    ind = sub2ind(size(M), x(:,1), j(:)); % Get linear indices from subscripts
    M(ind) = x(:,2)
    
    M =
    
         100        1100         110
         450         800           0
         500         200         890
           0           0           0
         400           0           0
    

    【讨论】:

    • 效果很好!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多