这个语句在 MatLab 中是什么意思
What does this statement mean in MatLab
filename = 'SOMETHING';
eval(['load ' filename]);
eval(['load ' filename '_vid1'])
vid123=permute(vid,[2 1 3]);
size(vid)
eval(['load ' filename '_vid2'])
vid123(:,:,(size(vid123,3)+1):(size(vid123,3)+size(vid,3)))=permute(vid,[2 1 3]);
size(vid)
我知道它与加载文件和查找具有相同名称并附加“_vidX”的其他文件有关,但第 7 行究竟是什么 do/mean?
只是重写第 7 行应该如何重写:
vid123=cat(3,vid123,permute(vid,[2 1 3])
它将第三维中的两个变量串联起来。如果您打算理解原始行,只需将结束语句放在应该使用的地方即可,它突然变得更具可读性:
vid123(:,:,end+1:end+size(vid,3))=permute(vid,[2 1 3]);
使用 end+1:end+size(vid,3)
将 size(vid,3)
-许多新切片插入 3d 矩阵 vid123
继续 Daniel 的回答,您的问题源于您不太了解 permute
的工作原理。 permute
的目标是重新排列矩阵的维度,但保持矩阵的大小不变。您指定要 "permute" 的矩阵以及告诉您哪些输入维度映射到输出的向量。
permute(vid, [2 1 3]);
的意思是输入的第二个维度去到输出的第一个维度。输入的第一维转到输入的第二维,第三维保持不变。这样做的效果是 vid
是一个 3D 矩阵,其中每个 2D 切片/帧都是 转置 ,同时在最终输出中保持相同数量的切片/帧。您正在交换第二个和第一个维度,这实际上是转置所做的。
因此,第一个加载语句通过变量 vid
加载到您的帧中,并且 vid123
最初有一定数量的帧,每个帧都被转置 - 这些对应于第一个视频。在此之后,您将加载第二个视频,其中 vid
被第二个视频的帧覆盖。然后将这些帧添加到 vid123
之上。因此,您只是将第一帧和第二帧的帧拼接在一起 - 转置创建一个更大的视频。
我强烈建议您重新保存它,以便两个视频被不同的变量清楚地分开,或者可能具有包含两个视频的结构。将变量 vid
存储在两个单独的文件中是有问题的。
像这样的东西会起作用:
load([filename '_vid1']);
vid1 = vid;
load([filename '_vid2']);
vid2 = vid;
clear vid;
save videos;
...甚至这样也行得通:
load([filename '_vid1']);
s.vid1 = vid;
load([filename '_vid2']);
s.vid2 = vid;
clear vid;
save videos;
在第一个版本中,两个视频都存储在单独的变量 vid1
和 vid2
中,在第二个版本中,两个视频都保存在一个结构中。
filename = 'SOMETHING';
eval(['load ' filename]);
eval(['load ' filename '_vid1'])
vid123=permute(vid,[2 1 3]);
size(vid)
eval(['load ' filename '_vid2'])
vid123(:,:,(size(vid123,3)+1):(size(vid123,3)+size(vid,3)))=permute(vid,[2 1 3]);
size(vid)
我知道它与加载文件和查找具有相同名称并附加“_vidX”的其他文件有关,但第 7 行究竟是什么 do/mean?
只是重写第 7 行应该如何重写:
vid123=cat(3,vid123,permute(vid,[2 1 3])
它将第三维中的两个变量串联起来。如果您打算理解原始行,只需将结束语句放在应该使用的地方即可,它突然变得更具可读性:
vid123(:,:,end+1:end+size(vid,3))=permute(vid,[2 1 3]);
使用 end+1:end+size(vid,3)
将 size(vid,3)
-许多新切片插入 3d 矩阵 vid123
继续 Daniel 的回答,您的问题源于您不太了解 permute
的工作原理。 permute
的目标是重新排列矩阵的维度,但保持矩阵的大小不变。您指定要 "permute" 的矩阵以及告诉您哪些输入维度映射到输出的向量。
permute(vid, [2 1 3]);
的意思是输入的第二个维度去到输出的第一个维度。输入的第一维转到输入的第二维,第三维保持不变。这样做的效果是 vid
是一个 3D 矩阵,其中每个 2D 切片/帧都是 转置 ,同时在最终输出中保持相同数量的切片/帧。您正在交换第二个和第一个维度,这实际上是转置所做的。
因此,第一个加载语句通过变量 vid
加载到您的帧中,并且 vid123
最初有一定数量的帧,每个帧都被转置 - 这些对应于第一个视频。在此之后,您将加载第二个视频,其中 vid
被第二个视频的帧覆盖。然后将这些帧添加到 vid123
之上。因此,您只是将第一帧和第二帧的帧拼接在一起 - 转置创建一个更大的视频。
我强烈建议您重新保存它,以便两个视频被不同的变量清楚地分开,或者可能具有包含两个视频的结构。将变量 vid
存储在两个单独的文件中是有问题的。
像这样的东西会起作用:
load([filename '_vid1']);
vid1 = vid;
load([filename '_vid2']);
vid2 = vid;
clear vid;
save videos;
...甚至这样也行得通:
load([filename '_vid1']);
s.vid1 = vid;
load([filename '_vid2']);
s.vid2 = vid;
clear vid;
save videos;
在第一个版本中,两个视频都存储在单独的变量 vid1
和 vid2
中,在第二个版本中,两个视频都保存在一个结构中。