【问题标题】:How to re-create a matrix from indices and values froma text file in matlab如何从matlab中文本文件的索引和值重新创建矩阵
【发布时间】:2011-05-22 06:30:53
【问题描述】:
我希望在 matlab 中执行以下操作:
-我有一个格式如下的文本文件:1 1 0.242
1 2 0.332
...
75 74 0.485
75 75 0.726
- 第一列是矩阵的第 i 个索引的列表,第二列是矩阵的第 j 个索引,第三列是特定索引 (i,j) 处的值。简而言之,我有一个 75x75 矩阵,其值在文本文件中。
- 我希望读取这些数据并在 matlab 中重新创建矩阵,这样我就可以对其进行操作。
有什么建议吗?
【问题讨论】:
标签:
matlab
file-io
sparse-matrix
【解决方案1】:
您描述的是一个存储稀疏矩阵(元组格式)的文件。稀疏矩阵是大多数元素为 0 的矩阵,因此为了节省空间,您只存储非零元素。 Matlab 有一个内置的稀疏矩阵对象。您可以直接加载文件:
>> load matrix.mtl;
>> A = spconvert(matrix);
见:http://bebop.cs.berkeley.edu/smc/formats/matlab.html
您可能需要注意的另一件事是 sparse 函数,它采用三个向量并将它们转换为稀疏矩阵。
稀疏矩阵可以转换为密集矩阵(即二维数组,这是大多数人说矩阵时的意思)使用full(A)
【解决方案2】:
要在 MATLAB 中重新创建完整的 75×75 矩阵,您可以首先使用函数 LOAD 加载文件:
data = load('datafile.txt','-ascii');
然后通过使用函数 SUB2IND 或您自己的简单计算将您的下标索引转换为 linear indices 来重新创建您的矩阵(不需要 for 循环):
mat = zeros(75); %# Initialize your matrix to zeroes
mat(sub2ind([75 75],data(:,1),data(:,2))) = data(:,3); %# Use SUB2IND...
%# ... or...
mat(75.*(data(:,2)-1)+data(:,1)) = data(:,3); %# ... convert them yourself.
【解决方案3】:
这取决于您是希望以交互方式还是以编程方式进行。
交互式:
使用向导导入文本文件。你会得到一个 nx3 矩阵(比如说data)的值。然后使用一个简单的 for 循环将所有值放在正确的位置。
A = zeros(75, 75);
for idx = 1:size(data, 1)
A(data(idx, 1), data(idx, 2)) = data(idx, 3);
end
以编程方式:
例如使用textscan 以编程方式导入文件。然后按照上面的方法进行。
【解决方案4】:
假设您的文件名为“data.txt”并且它只包含您提到的格式化信息,我认为最好的方法是这样的示例代码:
fid=fopen('data.txt','r');
data=fscanf(fid,'%g',[3 Inf]);
fclose(fid);
[m n]=size(data);
a=zeros(75,75);
for i=1:n
a(data(1,i),data(2,i))=data(3,i);
end
如果文件还包含其他信息,则应注意收集适当的行和数据。
作为您提供的少数样本的结果示例,数据矩阵将是
data =
1.0000 1.0000 75.0000 75.0000
1.0000 2.0000 74.0000 75.0000
0.2420 0.3320 0.4850 0.7260
如果还有其他问题,请告诉我们。祝你好运;)