如何在Matlab中将csv数据转换为3D矩阵?

时间:2014-10-22 19:32:00

标签: matlab csv 3d

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循环解决方案,但必须有一种更简单的方法来实现这一点......

1 个答案:

答案 0 :(得分:2)

您是否尝试过使用csvreadcsvread专门用于读取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开始,您需要找到XYZ的每列的最小值,减去最小值然后再添加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','.');

祝你好运!