matlab - 向量函数始终是常数

标签 matlab vector octave

刚接触 MATLAB,我需要有关以下问题的帮助。

我想创建一个函数val=F(v,e),它接受两个输入v、一个1xn向量,以及标量 e,并输出标量 val,用于计算向量 v-e 的非零条目,即向量 v> 从其所有条目中减去 e。我的函数代码如下:

function val = eff(vec, e)
val = sum( (vec - e > 0) );
end

当我在单个点评估该函数时,它会按预期工作。但我想要这个函数在 (0,1) 上的绘图。绘制它会给出 e 的整个范围内的恒定值。我在 main 上使用以下代码

figure
e = linspace(0,1);
plot(e, eff(rand(1,100),e),'o',e, e)

此外,当我使用小向量(例如 rand(1,10))时,我会收到以下错误消息:

>Error using  -
> 
>Matrix dimensions must agree.
>
>Error in eff (line 3)
>
>val = sum( (vec - e > 0 ));

我的函数是否对矩阵维度太粗心了?或者是否有更简单的方法来评估矢量范围内的eff

提前致谢。

最佳答案

您创建了一个函数,该函数设计仅适用于标量 e 参数,并且传递 e 作为数组可能会导致错误......但随后您使用 e = linspace(0,1) 调用它,它是一个数组。

e的大小为10时,特定的错误告诉您不能从大小为100的矩阵中减去它。

e 碰巧vec具有相同的大小时,您的函数将两个大小相等的数组相减,并返回它们的总和,即是一个标量。因此,您的绘图本质上是在执行类似 plot(a_range, a_scalar) 的操作,这就是它看起来恒定的原因。

相反,您可能应该在 for 循环中为 e 的每个值收集一个数组 V,或者使用 arrayfun,例如

e = linspace(0,1);
V = arrayfun(@eff, e);

然后绘制 eV

或者,您可以重写您的函数,使其期望 e 是一个数组,并且您的返回值是一个与 e 大小相同的数组,填充为适当的值。

关于matlab - 向量函数始终是常数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39441279/

相关文章:

Octave 音阶错误文件名未定义在行 x 列 y 附近

matlab - 将 ismember() 与包含向量的元胞数组一起使用

linux - 打开 "An error was encountered while saving the command history"Matlab报错

arrays - 使用非常量值的逻辑索引更新数组中的值

c++ - 删除 vector.end() 失败

c++ - 按行、列或随机从数组填充矩阵时出现错误索引问题

c - 错误: subscripted value is not an array,指针,或者 vector 和idk是什么问题?

c++ - Octave - .m 文件编译器?

matlab - 用零删除数组中的列

c - 在 Matlab 和 C 之间共享数据