Matlab: How to read data into a matrix

I have a data file matrix.txt, it has three columns. The first column stores the row index, the second column stores the column index, the third column stores the value. How do I read these into a matrix called mat. To be explicit, suppose our mat is a n*n square matrix, let n=2 for instance. In the text file, it has:

0 0 10
1 1 -10

The element in mat not specified is 0. Thus mat is supposed to be:

mat = 10   0
      0   -10

How do I achieve this?

Upvotes: 0

Views: 175

Answers (3)

Rotem
Rotem

Reputation: 32144

I see I am too slow, but I decided post my answer anyway...
I initialized matrix A as a vector, and used reshape:

%Load all file to matrix at once
%You may consider using fopen and fscanf, in case Matrix.txt is not ordered perfectly.
row_column_val = load('Matrix.txt', '-ascii');

R = row_column_val(:, 1) + 1; %Get vector of row indexes (add 1 - convert to Matalb indeces).
C = row_column_val(:, 2) + 1; %Get vector of column indexes (add 1 - convert to Matalb indeces).
V = row_column_val(:, 3);     %Get vector of values.

nrows = max(R); %Number of rows in matrix.
ncols = max(C); %Number of columns in matrix.

A = zeros(nrows*ncols, 1); %Initialize A as a vector instead of a matrix (length of A is nrows*ncols).

%Put value v in place c*ncols + r for all elements of V, C and R.
%The formula is used for column major matrix (Matlab stored matrices in column major format).
A((C-1)*nrows + R) = V;

A = reshape(A, [nrows, ncols]);

Upvotes: 1

Zeta.Investigator
Zeta.Investigator

Reputation: 983

Since in MATLAB, indices begin with 1 (not zero), we should add 1 to our indices in code.
r and c stand for row and column.
Alsom and n is for m by n zero matrix

A = importdata('matrix.txt');
r = A(:, 1)';
c = A(:, 2)';
m = max(r);
n = max(c);
B = zeros(m + 1, n + 1);
for k = 1:size(A,1);
    B(r(k) + 1, c(k) + 1) = A(k, 3);
end

Result:

B =

    10     0
     0   -10

Upvotes: 1

sco1
sco1

Reputation: 12214

This should work for the generic 2-D case.

% Read in matrix specification
fID = fopen('matrix.txt');
tmp = fscanf(fID, '%u%u%f', [3 inf])';
fclose(fID);

% Use the maximum row and column subscripts to obtain the matrix size
tmp(:, 1:2) = tmp(:, 1:2) + 1;  % MATLAB doesn't use 0-based indexing
matsize = [max(tmp(:,1)), max(tmp(:,2))];

% Convert subscripts to linear indices
lidx = sub2ind(matsize, tmp(:,1), tmp(:,2));

mat = zeros(matsize);  % Initialize matrix
mat(lidx) = tmp(:,3);  % Assign data

Using a sample matrix.txt:

0 0 10
1 1 -10
1 2 20

We receive:

>> mat

mat =

    10     0     0
     0   -10    20

Upvotes: 1

Related Questions