Info
Diese Frage ist geschlossen. Öffnen Sie sie erneut, um sie zu bearbeiten oder zu beantworten.
Transform cells to matrix
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
I have a text file with the gas concentration of each point of the space. It looks like this:
enviroment_min(m) -0.2000 -0.2000 0.0000 (X Y Z)
enviroment_max(m) 10.2000 6.2000 2.5000 (X Y Z)
NumCells_XYZ 104 64 25
CellSizes_XYZ[m] 0.1000 0.1000 0.1000
Cell_x (first colum) Cell_y(second colum) Cell_z(third colum) Gas_concentration(fourth colum)
2 2 0 0
2 2 1 0
2 2 2 0
2 2 3 0
... ... ... ...
2 2 24 0
2 3 0 0
2 3 1 0
... ... ... ...
2 3 24 0
2 4 0 0
... ... ... ...
2 61 24 0
3 2 0 0
3 2 1 0
... ... ... ...
So I have transform the text file to matrix:
fid = fopen('file.txt','rt');
C = textscan(fid, '%f %f %f %f', 'MultipleDelimsAsOne',true);
fclose(fid);
A = cell2mat(C);
And I would like to build a 3D matrix to plot the gas concentration, but I don't know very well how to do it. Something like this:
[0 8 2;
4 5 3;
... ... ...]
where each colum is the dimension x, y or z and the value of the matrix is the gas concentration at that point.
0 Kommentare
Antworten (2)
Guillaume
am 31 Jul. 2019
Assuming that the x, y and z are indeed integer as in your example, from 0 to Nx, Ny, Nz, then the easiest way may be:
result = accumarray(A(:, 1:3) + 1, A(:, 4)) %add 1 to coordinate as matlab indices start at 1, not 0
This assumes that no coordinate is repeated, otherwise you'll get the sum of the gas concentrations for that coordinate.
Note that x will be along the rows, y along the columns and z across the page, if you want x and y swapped:
result = accumarray(A(:, [2, 1, 3]) + 1, A(:, 4))
3 Kommentare
Guillaume
am 31 Jul. 2019
Your way is fine, and since you understand it, you should probably keep it, although you can get rid of the find, that is:
indices = A(:,4)<=1000; %logical array instead of explicit indices
would work just the same on the next line.
I would have done it like this:
[x, y, z] = ndgrid(-0.2:0.1:10.1, -0.2:0.1:6.1, 0.0:0.1:2.4); %create 3D matrix of x, y, z cells
gas_concentration = accumarray(A(:, 1:3)+1, A(:, 4), [], [], NaN); %create matching matrix for concentration
toplot = gas_concentration <= 1000; %will only plot value less than 1000 and not NaN (since NaN is not less than 1000)
scatter3(x(toplot), y(toplot), z(toplot), gas_concentration(toplot));
%... plot formatting
Andrei Bobrov
am 31 Jul. 2019
S = scatteredInterpolant(A(:,1),A(:,2),A(:,3),A(:,4));
result = S(A(:,1),A(:,2),A(:,3));
1 Kommentar
Guillaume
am 31 Jul. 2019
Seems a bit of a waste to create an interpolant if all you're doing is querying it to get back the same points that you put in.
However, there is value in doing this if the gas concentration is desired at points that are not in the input file.
Diese Frage ist geschlossen.
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
