从数据库构建新矩阵时如何避免在Matlab中出现for循环

时间:2018-11-17 22:19:50

标签: matlab

我有一个矩阵,其中有两列,大约有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)');

但是它没有用,因为新矩阵中的行数不相同。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

在j之下,计算j(k)等于向量x(1:k,1)中出现x(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