【问题标题】:Octave function should return a vector, not an 'ans'Octave 函数应该返回一个向量,而不是一个“ans”
【发布时间】:2015-04-14 12:52:29
【问题描述】:

我试图了解 Octave 函数中的值是如何返回的。我写了一个函数,它返回多个变量,即[error, accuracy, precision, npv, recall, F1_score]

我想要实现的是将每个 结果变量返回到控制台而不是标准ans(这似乎总是第一个变量)。

所以这很好用:

>> [error, accuracy, precision, npv, recall, F1_score] = describeConfMatrix([546, 0;314, 0])
error =  0.36512
accuracy =  0.63488
precision =  0.63488
npv = NA
recall =  1
F1_score =  0.77667

但这会产生“ans”:

>> z = describeConfMatrix([546, 0;314, 0])
z =  0.36512
>> describeConfMatrix([546, 0;314, 0])
ans =  0.36512

虽然我也希望看到返回变量的完整列表。

我也想让这个工作(测试功能的断言):

m = [546, 0;314, 0];
ans = [0.36512, 0.63488, 0.63488, NA, 1, 0.77667];
assert(isequal(describeConfMatrix(m),ans))

非常感谢 Matlab 新手!

这是我的代码:

function [error, accuracy, precision, npv, recall, F1_score] = describeConfMatrix(m)
  TP = m(1,1);
  FN = m(1,2);
  FP = m(2,1);
  TN = m(2,2);
  K = TP + FN + FP + TN;
  error = (FP + FN) / K;
  accuracy = (TP + TN) / K;
  precision = TP / (TP + FP); # sometimes called 'positive predictive value'
  recall = TP / (TP + FN);
  if (FN + TN) != 0
    npv = TN / (FN + TN);
  else
    npv = NA;
  end;
  F1_score = (2*precision*recall)/(precision + recall);
end

【问题讨论】:

  • MATLAB 也不会返回变量列表,因为它没有可靠的方法知道如何命名它们以防止覆盖数据。这就是为什么当没有指定输出时它只返回第一个答案为ans。为了确保它返回没有指定输出变量的所有数据,您需要使用varargout 或将输出格式化为单个数组。

标签: matlab octave


【解决方案1】:
  • 如果您没有为函数调用指定输出参数(例如describeConfMatrix([546, 0;314, 0])),它将仅将第一个输出变量返回为ans
  • 如果您只指定一个变量,它还将返回第一个输出变量 (z = describeConfMatrix([546, 0;314, 0]))。
  • 如果要返回所有变量,则必须在函数调用中指定它们,如[error, accuracy, precision, npv, recall, F1_score] = describeConfMatrix([546, 0;314, 0])

这是 MATLAB/Octave 中的正常和预期行为。由于同样的原因,您的assert 行将无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多