- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 MATLAB 中构建了一个空心立方体,我想用小立方体完全填充它的体积。然后我想找到一种方法来访问这些立方体并通过它们创建路径,即如果当前正在访问立方体 x,应该有一种方法可以知道它的右、左、上、下、前和后最近的邻居是什么(最近的邻居 = 紧邻当前立方体的立方体)。我认为我们有 6 个邻居,因为我们有立方体的 6 个不同面。
通过了解每个方向上最近的立方体,通过立方体的路径可以定义为一系列步骤(例如,右、左、左、上、右、前)。我认为为了能够访问每个小立方体并移动到附近的立方体,我们需要在矩阵(可能是 3D)中表示小立方体,如果一个小立方体的右侧有一个相邻立方体 x,那么在矩阵中,x将出现在小立方体当前列旁边的列中。此外,如果在另一个深度层有一个直接邻居(相同的 x、y 坐标但不同的 z 坐标,例如前后邻居),则应该指出它。有没有更简单的方法来识别邻居?
我从 rayryeng ( Building a hollow cube and filing it with small cubes in MATLAB ) 获得了一个代码,可以在大立方体中随机填充许多小立方体并构建一个 3D 矩阵,其中矩阵的每个切片(深度)代表一个小立方体和每个切片的行和列(8 行和 3 列)表示每个小立方体顶点的 x y z 坐标。请查看我提供的问题链接以查看代码。
我想对代码做两处修改,
1- 有组织地用小方 block 填充大方 block ,而不是随机填充。
2- 调整 3D 矩阵以表示小立方体如何彼此相邻。
我尝试调整链接问题中的代码,以有组织的方式填充立方体。这是我的试用版(我在 for 循环中添加了 if else),
clf;
figure(1);
format compact
h(1) = axes('Position',[0.2 0.2 0.6 0.6]);
%These are the different 8 vertices of the cube, each is defined by its 3 x
%y z coordinates:
vert = [1 1 -1;
-1 1 -1;
-1 1 1;
1 1 1;
-1 -1 1;
1 -1 1;
1 -1 -1;
-1 -1 -1];
%These are the 6 faces of the cube, each is defined by connecting 4 of the
%available vertices:
fac = [1 2 3 4;
4 3 5 6;
6 7 8 5;
1 2 8 7;
6 7 1 4;
2 3 5 8];
% I defined a new cube whose length is 1 and centers at the origin.
vert2 = vert * .05;
fac2 = fac;
patch('Faces',fac,'Vertices',vert,'Facecolor', 'w'); % patch function for the first big cube.
axis([-1, 1, -1, 1, -1, 1]);
axis equal;
hold on;
patch('Faces', fac2, 'Vertices', vert2, 'FaceColor', 'r', 'EdgeColor', 'none');
material metal;
alpha('color');
alphamap('rampdown');
%view(3);
hold on;
rng(123); %// Set seed for reproducibility
num_squares = 1000; %// Set total number of squares
%// New - to store the coordinates
coords = [];
%// For remembering the colours
colors = [];
%// For each square...
for idx = 1 : num_squares
%// Take the base cube and add an offset to each coordinate
%// Each coordinate will range from [-1,1]
if (idx==1)
vert_new = bsxfun(@plus, vert2, [.01 .01 .01]);
else
vert_new = bsxfun (@plus, vert_new,[.01 .01 .01] );
end
%// New - For the coordinates matrix
coords = cat(3, coords, vert_new);
%// Generate a random colour for each cube
color = rand(1,3);
%// New - Save the colour
colors = cat(1, colors, color);
%// Draw the cube
patch('Faces', fac, 'Vertices', vert_new, 'FaceColor', color,'EdgeColor', 'none');
end
%// Post processing
material metal;
alpha('color');
alphamap('rampdown');
view(3);
但我得到的结果如下图所示,
谁能告诉我如何解决这个问题并构建 3D 矩阵(或任何其他更简单的方法来表示每个立方体的邻居)?
编辑:详细说明小立方体邻居问题。考虑在大立方体内部的任何位置放置一个立方体 C。设立方体位置为 (.5,.5,.5),我们可以将其视为立方体的中心。然后,这个立方体将有 6 个相邻立方体(直接位于它旁边),每个轴有 2 个相邻立方体。所以,对于立方体 (.5,.5,.5) 我们有,
x 轴在 C 的右侧相邻 (.5 +offset, .5, .5)
C 左侧的 x 轴邻居(.5 -offset, .5, .5)
y 轴邻近 C 的顶部 (.5 , .5+offset, .5)
y 轴与 C 底部相邻(.5,.5 偏移,.5)
z 轴在 C (.5 , .5, .5+offset) 之后相邻一个深度
z 轴在 C 之前相邻一个深度(.5 , .5, .5-offset)
偏移量可以看作是立方体的中心与其任何面之间的距离。这只是为了阐明想法的解释,不需要以相同的方式实现。我希望这是清楚的,如果您能帮助我构建这个邻域矩阵,我将不胜感激。
谢谢。
最佳答案
同样的原理,我们 build 一个大立方体,然后在角落里 build 一个小立方体,然后我们用一个小的偏移量重复 build 小立方体,直到我们装满为止。与旧代码的主要区别在于,这次每个坐标集的步长变化是受控的(小立方体x,y,z
坐标的函数),而不是随机的。
%%
clf; figure(1); format compact
h(1) = axes('Position',[0.2 0.2 0.6 0.6]);
%These are the different 8 vertices of the cube, each is defined by its 3 x y z coordinates:
vert = [ 1 1 -1; -1 1 -1; -1 1 1; 1 1 1; -1 -1 1; 1 -1 1; 1 -1 -1; -1 -1 -1];
%These are the 6 faces of the cube, each is defined by connecting 4 of the available vertices:
fac = [1 2 3 4; 4 3 5 6; 6 7 8 5; 1 2 8 7; 6 7 1 4; 2 3 5 8];
%// How many small cube do we want
MainCubeSide = 2 ; %// dimension of the side of the main cube
nCubeOnSide = 5 ; %// number of small cube in one "row/column" of the main cube
nCubesTotal = nCubeOnSide^3 ; %// total number of small cube
% define the Main container cube
MainCube.Vertices = vert *(2/MainCubeSide) ; %// because the cube as defined above has already a side=2
MainCube.Faces = fac ;
MainCube.FaceColor = 'w' ;
hMainCube = patch(MainCube); %// patch function for the first big cube.
axis([-1, 1, -1, 1, -1, 1]);
axis equal;
hold on;
material metal;
alpha('color');
alphamap('rampdown');
view(138,24)
%view(3);
%% // generate all the coordinates of each cube first
dstep = MainCubeSide / nCubeOnSide ; %// step size for small cube vertices
vElem = bsxfun(@plus, vert / nCubeOnSide , -( MainCubeSide/2 - dstep/2)*[1 1 1] ) ; %// elementary cube vertices
%%
hold on;
coords = zeros( size(vElem,1),size(vElem,2), nCubesTotal ) ; %// To store the coordinates
colors = zeros( nCubesTotal , 3 ) ; %// To store the colours
hcube = zeros( nCubesTotal , 1 ) ; %// To store the handles of the patch objects
iNeighbour = zeros( nCubesTotal , 6 ) ; %// To save the index of the neighbours
idc = permute( reshape(1:nCubesTotal,nCubeOnSide,nCubeOnSide,nCubeOnSide) , [3 2 1] ) ;
%// For each cube ...
iCube = 0 ;
for iline=1:nCubeOnSide %// Lines
for icol=1:nCubeOnSide %// Columns
for ih=1:nCubeOnSide %// Slice (height)
iCube = iCube + 1 ;
%// Take the base corner coordinates and add an offset to each coordinate
coords(:,:,iCube) = bsxfun(@plus, vElem , dstep*[(iline-1) (icol-1) (ih-1)]);
%// Save the colour
colors(iCube,:) = rand(1,3) ;
%// Draw the cube
hcube(iCube) = patch('Faces', fac, 'Vertices', coords(:,:,iCube), 'FaceColor', colors(iCube,:) ) ;
drawnow %// just for intermediate display, you can comment these 2 lines
pause(0.05) %// just for intermediate display, you can comment these 2 lines
%// save adjacent cubes indices
ixAdj = [iline-1 iline+1 icol-1 icol+1 ih-1 ih+1] ; %// indices of adjacent cubes
idxFalse = (ixAdj<1) | (ixAdj>nCubeOnSide) ; %// detect cube which would be "out" of the main cube
ixAdj(idxFalse) = 1 ; %// just to not get an "indexing" error at this stage
iNeighbour(iCube,:) = [idc(ixAdj(1),icol,ih) idc(ixAdj(2),icol,ih) ...
idc(iline,ixAdj(3),ih) idc(iline,ixAdj(4),ih) ...
idc(iline,icol,ixAdj(5)) idc(iline,icol,ixAdj(6)) ] ;
iNeighbour(iCube,idxFalse) = NaN ;
end
end
end
此代码将每个立方体的句柄保存在变量 hcube
中因此,如果需要,您可以对所有多维数据集进行批量属性分配。例如delete(hcube)
将一次性删除所有小立方体,或 set(hcube,'Facealpha',0.5)
将使所有立方体半透明。
您还可以仅设置/更改其中一部分的属性 hcube(idx_subset) = ...
.这是通过索引了解相邻立方体可能有用的地方,但您的邻接问题尚未完全定义。
编辑:我在主循环中添加了邻居跟踪。这可能不是最有效的方法,但它确实保留了每个基本立方体的所有邻居的索引。iNeighbour
变量(大小:nCubesx6
)保存每个邻居的句柄索引(6 个可能的邻居)。当邻居不存在时,我选择放置一个 NaN
反而。不使用 NaN
直接检索邻居的索引s,我定义了一个辅助匿名函数:
getNeighbourIndex = @(idx) iNeighbour(idx,~isnan(iNeighbour(idx,:))) ;
现在可以帮助您跟踪给定立方体的所有邻居。例如:
set(hcube,'Visible','off') %// turn off all small cubes
CubeOfInterest = 111 ; %// select one cube
%// display the main cube of interest, and it's neighbours in transparency
set(hcube(CubeOfInterest),'Visible','on','FaceColor','r','FaceAlpha',1)
set(hcube(getNeighbourIndex(CubeOfInterest)),'Visible','on','FaceColor','g','FaceAlpha',.05)
如你所见,所有的邻居都在那里,无论我们是否靠近墙。
关于matlab - 在 MATLAB 中用小立方体填充立方体的整个体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31913149/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!