Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中构造三维点阵图_Matlab_Matrix_Graph Theory_Graph Algorithm - Fatal编程技术网

在MATLAB中构造三维点阵图

在MATLAB中构造三维点阵图,matlab,matrix,graph-theory,graph-algorithm,Matlab,Matrix,Graph Theory,Graph Algorithm,我对这个问题/答案()的扩展感兴趣,可以将4-连通的情况扩展到第三维 问题1:给定一个xyz维矩阵,如何构造6-连接邻接矩阵(或边列表) 问题2:给定邻接矩阵(或边列表),如何计算边权重作为连接节点值的函数(例如,平均值) 问题3:如何在不耗尽内存的情况下解决超大矩阵的问题1和2?稀疏矩阵或边列表似乎是可能的解决方案,但如何实现呢 %简单案例 X=2;Y=2;Z=2; mat=重塑([1:(X*Y*Z)],X,Y,Z); >>垫子 材料(:,:,1)= 1 3 2 4 材料(:,

我对这个问题/答案()的扩展感兴趣,可以将4-连通的情况扩展到第三维

问题1:给定一个xyz维矩阵,如何构造6-连接邻接矩阵(或边列表)

问题2:给定邻接矩阵(或边列表),如何计算边权重作为连接节点值的函数(例如,平均值)

问题3:如何在不耗尽内存的情况下解决超大矩阵的问题1和2?稀疏矩阵或边列表似乎是可能的解决方案,但如何实现呢

%简单案例
X=2;Y=2;Z=2;
mat=重塑([1:(X*Y*Z)],X,Y,Z);
>>垫子
材料(:,:,1)=
1     3
2     4
材料(:,:,2)=
5     7
6     8
%大箱
X=256;Y=256;Z=1000;
mat=重塑([1:(X*Y*Z)],X,Y,Z);

答案1:而不是建立一个庞大的边和权重矩阵。。。使用边列表直接在循环中迭代构建图形,在每个维度(行、列、平面)上循环。这个64x64x10运行速度非常快(秒),但对于大型示例(256x256x1000),运行时间要长得多。如果能找到一个更快的版本就好了

X=256;Y=256;Z=1000;
%0-1值的输入矩阵
mat=兰德(X,Y,Z);
%输入矩阵坐标的索引矩阵
imat=重塑([1:(X*Y*Z)],X,Y,Z);
%初始化空图
g=图();
xdim=大小(imat,1);
ydim=尺寸(imat,2);
zdim=尺寸(imat,3);
%使用权重创建边列表
disp('计算边和关联权重的开始/结束节点…')
对于y=1:(ydim-1)%z平面中的所有“水平”(柱)连接循环
%例如:
% 1 - 3
% 2 - 4
对于z=1:zdim
节点1=imat(:,y,z);
节点2=imat(:,y+1,z);%抓柱y+1平面z的节点
wts=((1-mat(:,y,z))+(1-mat(:,y+1,z))。/2;%每个节点的平均值为1
g=增加值(g,节点1,节点2,wts);%添加到图形
终止
终止
对于x=1:(xdim-1)%z平面内的所有“垂直”(行)连接循环
%例如:
% 1  3
% |  |
% 2  4
对于z=1:zdim
节点1=imat(x,:,z);
节点2=imat(x+1,:,z);%抓取平面z的x+1行节点
wts=((1-mat(x,:,z))+(1-mat(x+1,:,z)))/2;%每个节点的平均值为1
g=增加值(g,节点1,节点2,wts);%添加到图形
终止
终止
对于z=1:(zdim-1)%z平面上的所有“深”连接循环
%例如:
%   5  7
%  /  /
% 1  3
对于x=1:xdim
节点1=imat(x,:,z);
节点2=imat(x,:,z+1);%抓取平面z+1的x行节点
wts=((1-mat(x,:,z))+(1-mat(x,:,z+1)))/2;%每个节点的平均值为1
g=增加值(g,节点1,节点2,wts);%添加到图形
终止
终止
disp('完成')
图形
间谍(邻接(g))
答案2:将链接答案的4连格扩展到第三维度():

disp(“计算邻接矩阵…”)
X=3;Y=3;Z=2;
mat=重塑([1:(X*Y*Z)],X,Y,Z);
[x,y,z]=尺寸(垫子);%获取矩阵大小
diagVec1=repmat(repmat([one(y-1,1);0],x,1),z,1);%做第一个对角向量
%(用于y平面连接)
diagVec1=diagVec1(1:end-1);%删除最后一个值
diagVec2=repmat([一(y*(x-1),1);零(x,1)],z,1);%做第二个对角向量
%(用于x平面连接)
diagVec2=diagVec2(1:end-x);%删除最后的x值(零)
diagVec3=一(x*y*(z-1),1);%做第三个对角向量
%(用于z平面连接)
adj=diag(diagVec1,1)+diag(diagVec2,y)+diag(diagVec3,x*y);%将对角线添加到零矩阵
adj=adj+adj.;%将矩阵添加到
%使其对称
disp(“完成”)
图形
间谍
对于较大的情况,Matlab抱怨有错误:

Error using diag
Requested 65536000x65536000 (32000000.0GB) array exceeds maximum array size preference. Creation of
arrays greater than this limit may take a long time and cause MATLAB to become unresponsive.

Error in blah (line X)
adj = diag(diagVec1, 1) + diag(diagVec2, y) + diag(diagVec3, x*y);   % Add the diagonals to a zero matrix
这种方法用于在一个方向上查找每个节点的邻居。例如,在维度2中,我们在每个节点的右侧找到(有效)邻居

在这里,蓝色节点是边的源,其右侧的红色节点是目标节点。因此,源节点和目标节点的栅格彼此偏移1

% Given a 3d matrix M, generate a graph representing
% the 6-connected neighbors.
% Node numbers are equal to node indices in M.
% Edge weights are given by mean of adjacent node values.
[m, n, p] = size(M);

% Initialize Source and Target node vectors and corresponding Weight
S = T = W = [];

% List neighboring nodes where S(i) < T(i)
% Neighbors along dimension 1
[X1, X2, X3] = ndgrid(1:m-1, 1:n, 1:p);
S = [S; sub2ind(size(M), X1(:), X2(:), X3(:))];

[X1, X2, X3] = ndgrid(2:m, 1:n, 1:p);
T = [T; sub2ind(size(M), X1(:), X2(:), X3(:))];

% Neighbors along dimension 2
[X1, X2, X3] = ndgrid(1:m, 1:n-1, 1:p);
S = [S; sub2ind(size(M), X1(:), X2(:), X3(:))];

[X1, X2, X3] = ndgrid(1:m, 2:n, 1:p);
T = [T; sub2ind(size(M), X1(:), X2(:), X3(:))];

% Neighbors along dimension 3
[X1, X2, X3] = ndgrid(1:m, 1:n, 1:p-1);
S = [S; sub2ind(size(M), X1(:), X2(:), X3(:))];

[X1, X2, X3] = ndgrid(1:m, 1:n, 2:p);
T = [T; sub2ind(size(M), X1(:), X2(:), X3(:))];

% Calculate the weight for each edge 
W = mean(M([S, T]), 2);

%% Adjacency matrix A is for an undirected graph
%%    therefore only edges where S(i) < T(i) are listed.
%%    If the backward edges are also necessary:
% tempS = S;
% S = [S;T];
% T = [T;tempS];
% W = [W;W];

% [S T W] gives the graph's edge list.
% If the sparse adjacency matrix is required:
A = sparse(S, T, W);

(无向)边列表大约需要45秒,生成稀疏邻接矩阵还需要20秒左右。由于我使用倍频程,我无法测试哪一个生成图形更快。

您想要3d矩阵的4连通邻域,还是6连通邻域,以便平面也连通?好的观点。6-连接。您将使用此图表做什么?显式表示通常是不必要的,例如在图像处理中,所有的图方法都可以用隐式图更有效地实现。如果确实需要显式的图形表示,则通常值得使用边列表表示,而不是邻接矩阵。邻接矩阵仅对稠密连通图有效。对于矩阵(图像?)中的邻居,图形总是非常稀疏,使得邻接矩阵在计算和内存方面都效率低下。想要在其上运行图形最短路径算法。为什么要使用
有向图
而不是
?你的边真的是定向的吗?一个接一个地向图中添加边将非常缓慢。最好创建边列表/邻接矩阵并将其传递给图形构造函数。我将清理一些代码来生成边缘列表并发布。很好!我喜欢这种方法。这绝对适用于