csv文件包含4列。前三列描述X,Y,Z,坐标,第四列Q描述这种3D空间中的定量属性。 此数组说明了输入数据的示例:
DATA = [-3, -1, 1, -9;...
-3, -1, 2, -6;...
-3, -1, 3, -3;...
-3, 0, 1, -6;...
-3, 0, 2, -3;...
-3, 0, 3, 0;...
-3, 1, 1, -3;...
-3, 1, 2, 0;...
-3, 1, 3, 3;...
-2, -1, 1, -6;...
-2, -1, 2, -3;...
-2, -1, 3, 0;...
-2, 0, 1, -3;...
-2, 0, 2, 0;...
-2, 0, 3, 3;...
-2, 1, 1, 0;...
-2, 1, 2, 3;...
-2, 1, 3, 6;...
-1, -1, 1, -3;...
-1, -1, 2, 0;...
-1, -1, 3, 3;...
-1, 0, 1, 0;...
-1, 0, 2, 3;...
-1, 0, 3, 6;...
-1, 1, 1, 3;...
-1, 1, 2, 6;...
-1, 1, 3, 9;...
0, -1, 1, 0;...
0, -1, 2, 3;...
0, -1, 3, 6;...
0, 0, 1, 3;...
0, 0, 2, 6;...
0, 0, 3, 9;...
0, 1, 1, 6;...
0, 1, 2, 9;...
0, 1, 3, 12]
我想使用 scatter3 函数绘制此数据:
Xo = unique(DATA(:,1));
Yo = unique(DATA(:,2));
Zo = unique(DATA(:,3));
[Xs, Ys, Zs] = meshgrid(Xo, Yo, Zo);
Qs = ???
scatter3(Xs(:),Ys(:),Zs(:),[],Qs(:),'Marker','.')
我正在寻找一个优雅的解决方案(最好是内置的Matlab函数)来准确地从csv输入数据中提取Qs。 (目前我正在实现一个复杂的嵌套for循环解决方案,但必须有一种更简单的方法来实现这一点...... )
答案 0 :(得分:2)
您是否尝试过使用csvread
? csvread
专门用于读取CSV文件并将数值数据放入矩阵中。使用csvread
后,这应该在工作区中创建数据的N x 4
矩阵,因此只需提取您想要的任何列!我假设你的CSV文件只包含4列数字数据。
在您的情况下,您希望以这种方式致电scatter3
,假设您的数据已被读入矩阵A
并且您有一个名为text.csv
的文本文件:
A = csvread('text.csv');
scatter3(A(:,1), A(:,2), A(:,3), [], A(:,4), 'Marker', '.');
CSV数据的第一行,第二行,第三行和第四行分别表示X,Y,Z和Q数据,因此我假设您只想绘制这些3D坐标使用矩阵的列。
您希望创建一个3D矩阵Qs
,它将存储每个对应的Q
元组的XYZ
值。这样做的诀窍是确保您的XYZ坐标从索引1开始。一旦执行此操作,您可以使用sub2ind
确定线性索引或列主要索引,以在Qs
中填充这些值。要使每个维度从1开始,您需要找到X
,Y
和Z
的每列的最小值,减去最小值然后再添加1.代码你上面用meshgrid
来计算网格是很好的。您只需确定在Q
中需要将值放在Qs
中的位置。
因此:
%// From your code
Xo = unique(DATA(:,1));
Yo = unique(DATA(:,2));
Zo = unique(DATA(:,3));
[Xs, Ys, Zs] = meshgrid(Xo, Yo, Zo);
%// Now figure out where to access
%// Qs and copy Q values over
X = DATA(:,1);
Y = DATA(:,2);
Z = DATA(:,3);
Xoffset = X - min(Xo) + 1;
Yoffset = Y - min(Yo) + 1;
Zoffset = Z - min(Zo) + 1;
ind = sub2ind(size(Xs), Yoffset, Xoffset, Zoffset);
Qs = zeros(size(Xs));
Qs(ind) = DATA(:,4);
Qs
现在已成形为您想要的3D矩阵。现在,您所要做的就是之前为scatter3
所做的事情:
scatter3(Xs(:),Ys(:),Zs(:),[],Qs(:),'Marker','.');