我正在为MATLAB中的变量分配一些文件。我有点懒,尝试可能会演示一点问题解决,所以我试着编写一个函数来做到这一点。功能的主体:
i=0
for i=0:8
eval(sprintf('C%d=wavread([''C'' num2str(i)]);', i));
eval(sprintf('Cs%d=wavread([''Cs'' num2str(i)]);', i));
eval(sprintf('D%d=wavread([''D'' num2str(i)]);', i));
eval(sprintf('Ef%d=wavread([''Ef'' num2str(i)]);', i));
eval(sprintf('E%d=wavread([''E'' num2str(i)]);', i));
eval(sprintf('F%d=wavread([''F'' num2str(i)]);', i));
eval(sprintf('Fs%d=wavread([''Fs'' num2str(i)]);', i));
eval(sprintf('G%d=wavread([''G'' num2str(i)]);', i));
eval(sprintf('Af%d=wavread([''Af'' num2str(i)]);', i));
eval(sprintf('A%d=wavread([''A'' num2str(i)]);', i));
eval(sprintf('Bf%d=wavread([''Bf'' num2str(i)]);', i));
eval(sprintf('B%d=wavread([''B'' num2str(i)]);', i));
i=i+1
end
当我只为i分配一个值并在循环中运行代码时,所有东西都是笨拙的,但是当我实际将它作为循环运行时,它只会运行完成而不返回任何变量。
任何想法为什么?
谢谢你们!还弄清楚为什么我的功能没有返回任何东西!愚蠢的错误:)
答案 0 :(得分:1)
我相信这是因为eval
生成了自己的工作区,所以在创建变量时,它们会在eval
调用结束时丢失,有点像变量在内部创建的方式函数返回时会丢失。我建议你以'正确'的方式做这个并使用单元格数组:
i = 0; % Note: uneccessary line!
for i = 0:8
C{i + 1} = wavread(['C' num2str(i)]);
Cs{i + 1} = wavread(['Cs' num2str(i)]);
D{i + 1} = wavread(['D' num2str(i)]);
Ef{i + 1} = wavread(['Ef' num2str(i)]);
E{i + 1} = wavread(['E' num2str(i)]);
F{i + 1} = wavread(['F' num2str(i)]);
Fs{i + 1} = wavread(['Fs' num2str(i)]);
G{i + 1} = wavread(['G' num2str(i)]);
Af{i + 1} = wavread(['Af' num2str(i)]);
A{i + 1} = wavread(['A' num2str(i)]);
Bf{i + 1} = wavread(['Bf' num2str(i)]);
B{i + 1} = wavread(['B' num2str(i)]);
i = i+1; % Note: uneccessary line!
end
编辑:忽略我对eval
所说的内容,请参阅下面Dan的评论。尽管如此,细胞阵列是解决这个问题的合适方法。
答案 1 :(得分:0)
如果您的代码是您所说的函数体,那么eval
生成的代码将作用于该函数。函数一返回,就会释放变量。 jazzbassrob发布的代码如果在函数中也不会起作用,但绝对是正确的方法。只是让它成为一个脚本,而不是一个函数。或者甚至更好,让函数返回单元格数组:
function [C, Cs, ...] = readWavs()
for ii = 0:8
C{ii} = wavread(['C' num2str(ii)]);
....
ii = ii + 1 %NB this line makes no sense! i will increment by 1 anyway because of the for loop. If you want to increment by 2 then you should change the loop to for ii = 0:2:8
end
end
或者单元格数组的结构:
function wavStruct = readWavs()
for ii = 0:8
wavStruct{ii}.C = wavread(['C' num2str(ii)]);
...
end
end
此外,最好不要在{@ 1}}中使用i
或j
作为变量名,因为它们是为sqrt(-1)
保留的,因此我使用了ii