动态变量
请注意,虽然这是可能,但它被认为是糟糕的编程(例如,参见 here 或 this blog by Loren,甚至在他们的 documentation 中的 Mathworks 告诉你不要这样做)。将图像直接加载到 3D 数组或单元结构中会更好,避免使用动态变量名称。为了完整起见,我只是发布了这个;如果您碰巧必须使用此解决方案,则应立即更改为(单元格)数组。
关于为什么eval 是一个坏主意的链接文章的要点是,MATLAB 无法再预测操作的结果将是什么。例如A=3*(2:4) 被 MATLAB 识别为输出一个双数组。如果你eval 东西,MATLAB 不能再这样做了。 MATLAB 是一种解释型语言,即读取然后运行每一行代码,而无需事先编译整个代码。这意味着每次 MATLAB 遇到 eval 时,它必须停止、计算表达式,然后检查输出、存储并继续。 MATLAB 使用的大多数速度引擎(JIT/MAGMA 等)如果不预测语句的结果就无法工作,因此会在 eval 评估期间关闭,从而使您的代码非常慢。
eval 的使用还有一个安全方面的问题。考虑以下几点:
var1=1;
var2=2;
var3=3;
varnames={'var1','var2; disp(''GOTCHA''); %', 'var3'};
accumvar=[];
for k=1:numel(varnames)
vname=varnames{k};
disp(['Reading from variable named ' vname]); eval(['accumvar(end+1)=' vname ';']);
end
现在accumvar 将包含所需的变量名称。但是如果你不设置accumvar作为输出,你最好不要使用disp,但是例如eval('rm -rf ~/*') 这会格式化你的整个磁盘,甚至不会告诉你它正在这样做。
循环方法
for ii = 200:-1:1
str = sprintf('Image_%d',ii);
A(:,:,ii) = eval(str);
end
这将创建您的矩阵。请注意,我让for 循环向后运行,以便将A 初始化为最大尺寸。
半矢量化方法
str=strsplit(sprintf('image_%d ',1:200),' '); % Create all your names
str(end)=[]; % Delete the last entry (empty)
%Problem: eval cannot handle cells, loop anyway:
for ii = 200:-1:1
A(:,:,ii)=eval(str{ii});
end
eval不支持数组,所以不能直接插入cellarraystrin。
动态文件名
尽管标题与上述类似,但这意味着您的 文件名 是结构化的,所以在文件浏览器中,而不是在 MATLAB 中。我在这里假设 .jpg 文件,但您可以添加每个支持的图像扩展名。此外,请确保将所有图像放在一个文件夹中,并且没有具有该扩展名的其他图像,否则您必须修改 dir() 调用以仅包含所需的图像。
filenames = dir('*.jpg');
for ii = length(filenames):-1:1
A(:,:,:,ii) = imread(filenames{ii});
end
图像通常被读取为m*n*3 文件,其中m*n 是以像素为单位的图像大小,3 源于imread 将它们读取为RGB 的事实。因此A现在是一个4D矩阵,结构为m*n*3*T,其中最后一个索引对应图像的时间,前三个是你的RGB格式的图像。
由于您没有指定如何获得 40*40 双精度,因此我留下了 4D 矩阵。您是否可以阅读它们,然后切换到使用 RGB 的uint16 解释,这是一个单一的数字,这将导致 m*n*1*T 变量,您可以通过调用 A = squeeze(A(:,:,1,:)); 将其简化为 3D 变量