我有一个矩阵,其中有两列,大约有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)');
但是它没有用,因为新矩阵中的行数不相同。
感谢您的帮助。
答案 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