1

我有一个 3D 密度函数 q(x,y,z),我试图在 Matlab 8.3.0.532 (R2014a) 中绘制它。

我的函数域从 a 开始,到 b 结束,间距为 ds。我想在三元曲面图上绘制密度,图中的每个维度代表给定点 x、y、z 的比例。例如,如果我在 q(1,1,1) 的域上有一个密度单位,在 q(17,17,17) 的域上有另一个密度单位,在这两种情况下,x 的比例相等,因此,y,z 和 I 在坐标 (1/3,1/3,1/3) 处的三元曲面图上有两个密度单位。我有使用ternsurf的代码. 问题是比例点的数量随着域的大小呈指数增长。目前我只能用单位间距(ds = 1)绘制一个大小为 10(每个维度)的域。但是,我需要一个比这大得多的域(每个维度的大小为 100)并且比单位间距小得多(理想情况下小至 0.1) - 这将导致 100^3 * (1/0.1)^3 点在网格上,这是 Matlab 无法处理的。有没有人知道如何通过 3D 比例以某种方式对密度函数进行分类以减少点数?

我的工作代码与示例:

a = 0; % start of domain
b = 10; % end of domain
ds = 1; % spacing

[x, y, z] = ndgrid((a:ds:b)); % generate 3D independent variables
n = size(x);

q = zeros(n); % generate 3D dependent variable with some norm distributed density
for i = 1:n(1)
    for j = 1:n(2)
        for k = 1:n(2)
            q(i,j,k) = exp(-(((x(i,j,k) - 10)^2 + (y(i,j,k) - 10)^2 + (z(i,j,k) - 10)^2) / 20));
        end
    end
end

Total = x + y + z; % calculate the total of x,y,z at every point in the domain
x = x ./ Total; % find the proportion of x at every point in the domain
y = y ./ Total; % find the proportion of y at every point in the domain
z = z ./ Total; % find the proportion of z at every point in the domain
x(isnan(x)) = 0; % set coordinate (0,0,0) to 0
y(isnan(y)) = 0; % set coordinate (0,0,0) to 0
z(isnan(z)) = 0; % set coordinate (0,0,0) to 0

xP = reshape(x,[1, numel(x)]); % create a vector of the proportions of x
yP = reshape(y,[1, numel(y)]); % create a vector of the proportions of y
zP = reshape(z,[1, numel(z)]); % create a vector of the proportions of z

q = reshape(q,[1, numel(q)]);  % create a vector of the dependent variable q

ternsurf(xP, yP, q);  % plot the ternary surface of q against proportions
shading(gca, 'interp');
colorbar
view(2)
4

2 回答 2

0

离散化方法可能取决于您的情节的使用,也许从这个角度澄清您的问题是有意义的。总体而言,您可能会遇到“内存不足”错误,此处描述了一些相关技巧http://www.mathworks.nl/help/matlab/matlab_prog/resolving-out-of-memory-errors.html? s_tid=doc_12b?refresh=true#brh72ex-52。当然,它们仅适用于特定大小的数组。

更通用的解决方案是将部分阵列保存在硬盘驱动器上,这会使处理速度变慢,但它会起作用。例如,您可以使用特定于比例的 ngrids 定义几个 q 函数(例如 ngridOrder0=[0:10:100]、ngridOrder10=[1:1:9]、ngridOrder11=[11:1:19] 等... ),并编写一个访问器函数,该函数将根据您正在查看的绘图部分加载/保存相关的网格和 q 函数。

于 2014-10-09T09:17:24.920 回答
0

我相信您的意思是n(3)在最里面的循环中。这里有一些提示:

1)松开循环:

q = exp(- ((x - 10).^2 + (y - 10).^2 + (z - 10).^2) / 20);

2)松开重塑:

xP = x(:); yP = y(:); zP = z(:);

3) 检查Total一次,而不是对 3 次检查x,y,z

Total = x + y + z; % calculate the total of x,y,z at every point in the domain
Total( abs(Total) < eps ) = 1;
x = x ./ Total; % find the proportion of x at every point in the domain
y = y ./ Total; % find the proportion of y at every point in the domain
z = z ./ Total; % find the proportion of z at every point in the domain

PS:我刚刚认出了你的名字……是乔纳森;)

于 2014-10-07T22:58:19.007 回答