【问题标题】:MATLAB function syntax within script?脚本中的 MATLAB 函数语法?
【发布时间】:2013-01-16 19:30:12
【问题描述】:

在我的脚本中声明函数时遇到了一些问题:

%读取原始音频数据

refData = wavread('file1.wav');
userData = wavread('file2.wav'); 

% I want to continue writing my "main" function here, and call the below functions

%%%%%%%%%%%%%
% Functions %
%%%%%%%%%%%%%

%Vector x
function preEmphasis(x)
    alpha = 0.95;
    len = length(x);
    for i=1:len
        x_i = x(i);
        x_iMinus1 = x(i-1);
        x(i) = x_i - alpha*x_iMinus1;
    end
end

%Vector x
function normalization(x)
    maxVal = max(abs(x));
    x = x / maxVal;
end

%Vector x; numFrames, frameSize: integers; stepSize: percentage (float, 0.2 -> 0.5 for example)
function Ymatrix = createYmatrix(x, numFrames, frameSize, stepSize)
        Ymatrix = zeros(numFrames, frameSize);
        for i=1:numFrames
            for j=1:frameSize
                Ymatrix(i,j) = x(stepSize*i + j);
            end
        end
end

“函数”和“结束”这两个词以红色突出显示为“解析错误”。我怎样才能解决这个问题?谢谢。

【问题讨论】:

    标签: function matlab syntax


    【解决方案1】:

    您不能在主脚本中声明函数。您必须创建一个外部 m 文件并在其中实现您的功能,就像它在 official documentation 中所说的那样:

    任何不是anonymous 的函数都必须在文件中定义。

    (为了清楚起见,脚本不接受输入参数或返回输出参数)。

    但是,您可以在函数 m 文件中声明局部函数。 在the official documentation 中阅读有关函数声明的更多信息。

    编辑:如果您正在寻找一种完全避免函数 m 文件的方法,您可以参考 @natan 的回答。他将您的函数实现为anonymous functions可以在脚本文件中声明。祝你好运!

    【讨论】:

    • "m 文件中的本地函数" 这不是我想要做的吗?至少这就是我想要的……厌倦了快速编写脚本的多文件废话。
    • 我不相信。我认为这是您的主要脚本,因为它的开头没有函数声明。
    • 但是否则我正在使用函数... end 是正确的,我可以将所有函数移动到另一个文件中?
    • end 在您的函数中是可选的。只需创建一个名为“mymainfunc.m”的 m 文件,例如以 function y = mymainfunc(x) 开头,实现它并将其余函数复制粘贴到其中。然后从你的主脚本调用mymainfunc注意:您的 m 文件必须像该文件中的 main 函数一样调用。另外,this question 也可能把事情弄清楚……
    • 如果你想“快速”编写脚本,你总是可以在run.m 文件中创建一个函数run,并在其中实现everything。你仍然需要编写一个主脚本并调用run,不过......或者只是尝试在没有函数的情况下进行管理:)
    【解决方案2】:

    除了 Eitan 提到的之外,这里是如何在您的情况下实现匿名函数,请注意代码向量化是必须的。例如,在你的情况下,你可以写而不是normalization

    normalization = @(x) x./max(abs(x));
    

    然后像函数一样使用它,y=normalization(x)

    对于preEmphasis

    preEmphasis= @(x) [x(1) x(2:end)-0.95*x(1:end-1)];
    

    您当前的代码在i=1 的情况下存在错误,因此我将其解释为for=2:len

    Ymatrix 的解决方案有点难看(没有投入太多时间很好地对其进行矢量化),但它应该可以工作:

    Ymatrix = @(x, numFrames, frameSize, stepSize) ...
              ones(1,numFrames)'*x(1+stepSize:stepSize+frameSize)+...
              meshgrid(0:stepSize:stepSize*numFrames-1,ones(1,frameSize))';
    

    【讨论】:

    • 大声笑,我刚刚在我的一个 cmets 中提出了它 :) +1 反正。不知createYmatrix能不能做成匿名函数:P
    • 是的,Ymatrix 可以做成匿名函数,看我的编辑
    【解决方案3】:

    只要把你的脚本变成一个函数;那么您可以使用本地和嵌套函数。如果您需要将值返回到基础或调用者的工作区,请使用返回值或 assignin

    【讨论】: