Matlab:排序二维矩阵并保留三角形组中的节点
Matlab: Sorting 2D matrix and retaining nodes in triangle groups
我正在尝试优化一个 Matlab 脚本(下方),该脚本找到二维 space 中所有左下三角形函数值的边界框。代码遍历所有三角形,然后根据功能值按升序对节点进行排序。这似乎效率低下。
有没有什么方法可以在循环之前对函数值进行排序,但仍保留三角形组中的节点?或者其他一些加快速度的聪明方法?
clear;
x = (1:600)';
y = (1:500);
z = 2 * x.^2 + y;
zGrid = linspace(min(z, [], 'all') - 1, max(z, [], 'all') + 1, 200);
for iX = 1:length(x) - 1
for iY = 1:length(y) - 1
% Node indices
xIndices = [iX, iX, iX + 1];
yIndices = [iY, iY + 1, iY];
% Node values
xTmp = x(xIndices);
yTmp = y(yIndices);
zTmp = z(sub2ind(size(z), xIndices, yIndices));
% Node sorted according to z
[zSorted, indicesSorted] = sort(zTmp);
xSorted = xTmp(indicesSorted);
ySorted = yTmp(indicesSorted);
% Get bounding box on zGrid
iMin = find(zGrid <= zSorted(1), 1, 'last');
iMax = find(zGrid(iMin:end) >= zSorted(end), 1, 'first') + (iMin - 1);
end
end
您可以使用 meshgrid 生成所有索引,然后只需修改代码即可获得所需的输出:
x = (1:600).';
y = (1:500);
z = 2 * x.^2 + y;
zGrid = linspace(min(z(:)) - 1, max(z(:)) + 1, 200);
[X,Y] = meshgrid(x(1:end-1),y(1:end-1));
X = X(:);
Y = Y(:);
% Node indices
xIndices = [X, X, X + 1];
yIndices = [Y, Y + 1, Y];
% Node values
xTmp = x(xIndices);
yTmp = y(yIndices);
zTmp = z(sub2ind(size(z), xIndices, yIndices));
% Node sorted according to z
[zSorted, indicesSorted] = sort(zTmp,2);
xSorted = xTmp(indicesSorted+[0:3:(length(X)-1)*3].');
ySorted = yTmp(indicesSorted+[0:3:(length(Y)-1)*3].');
% Get bounding box on zGrid
% I use fliplr to get the last value and not the first one
[~,iMin] = max(fliplr(zGrid <= zSorted(:,1)),[], 2);
iMin = 200-iMin+1; %first to last value conversion
[~,iMax] = max(zGrid(iMin:end) >= zSorted(:,end),[],2);
iMax = iMax + iMin -1;
我正在尝试优化一个 Matlab 脚本(下方),该脚本找到二维 space 中所有左下三角形函数值的边界框。代码遍历所有三角形,然后根据功能值按升序对节点进行排序。这似乎效率低下。
有没有什么方法可以在循环之前对函数值进行排序,但仍保留三角形组中的节点?或者其他一些加快速度的聪明方法?
clear;
x = (1:600)';
y = (1:500);
z = 2 * x.^2 + y;
zGrid = linspace(min(z, [], 'all') - 1, max(z, [], 'all') + 1, 200);
for iX = 1:length(x) - 1
for iY = 1:length(y) - 1
% Node indices
xIndices = [iX, iX, iX + 1];
yIndices = [iY, iY + 1, iY];
% Node values
xTmp = x(xIndices);
yTmp = y(yIndices);
zTmp = z(sub2ind(size(z), xIndices, yIndices));
% Node sorted according to z
[zSorted, indicesSorted] = sort(zTmp);
xSorted = xTmp(indicesSorted);
ySorted = yTmp(indicesSorted);
% Get bounding box on zGrid
iMin = find(zGrid <= zSorted(1), 1, 'last');
iMax = find(zGrid(iMin:end) >= zSorted(end), 1, 'first') + (iMin - 1);
end
end
您可以使用 meshgrid 生成所有索引,然后只需修改代码即可获得所需的输出:
x = (1:600).';
y = (1:500);
z = 2 * x.^2 + y;
zGrid = linspace(min(z(:)) - 1, max(z(:)) + 1, 200);
[X,Y] = meshgrid(x(1:end-1),y(1:end-1));
X = X(:);
Y = Y(:);
% Node indices
xIndices = [X, X, X + 1];
yIndices = [Y, Y + 1, Y];
% Node values
xTmp = x(xIndices);
yTmp = y(yIndices);
zTmp = z(sub2ind(size(z), xIndices, yIndices));
% Node sorted according to z
[zSorted, indicesSorted] = sort(zTmp,2);
xSorted = xTmp(indicesSorted+[0:3:(length(X)-1)*3].');
ySorted = yTmp(indicesSorted+[0:3:(length(Y)-1)*3].');
% Get bounding box on zGrid
% I use fliplr to get the last value and not the first one
[~,iMin] = max(fliplr(zGrid <= zSorted(:,1)),[], 2);
iMin = 200-iMin+1; %first to last value conversion
[~,iMax] = max(zGrid(iMin:end) >= zSorted(:,end),[],2);
iMax = iMax + iMin -1;