错误:赋值比非单例下标

时间:2015-11-15 22:34:40

标签: matlab linear-regression

我的代码中有一个很大的问题,我花了很多时间,试图了解我必须做些什么来解决我的问题。好吧,我有以下.m文件和 - 我的问题的标题说 - 在运行main.m文件期间错误:"赋值比非单例下标更多非单例rhs维度"发生。

所以,文件是:

  • computeCost.m

    function J = computeCost(X, y, theta)
    
    m = length(y); % number of training examples
    
    J(m,1) = 0;
    
    for k=1:m
        J(:,1) = ((X*theta)-y).^2; 
    end
    %syms k;
    %S = symsum(((X*theta)-y).^2,k,1,m);
    %J = (1/(2*m))*S;
    J(m,1) = (1/(2*m))*J(m,1);
    
  • gradientDescent.m

    function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
    
    m = length(y); % number of training examples
    J_history = zeros(num_iters, 1);
    
    for iter = 1:num_iters
    
    J_history(iter,1) = computeCost(X, y, theta); // HERE IS THE ERROR!!!(1st case)
    
    end
    
    end
    

在编写上述代码之前,我有以下内容:

  • computeCost.m

    function J = computeCost(X, y, theta)
    
    m = length(y); % number of training examples
    
    J = 0;
    
    for k=1:m
        J(:) = ((X(k)*theta(k))-y(k)).^2;
    end
    %syms k;
    %S = symsum(((X*theta)-y).^2,k,1,m);
    %J = (1/(2*m))*S;
    J(m) = (1/(2*m))*J(m);
    
  • gradientDescent.m

    function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
    
    m = length(y); % number of training examples
    J_history = zeros(num_iters, 1);
    
    for iter = 1:num_iters
    
    J_history(iter) = computeCost(X, y, theta); // HERE IS THE ERROR(2nd case)
    
    end
    
    end
    

当我有最后一个代码时,我面临另一个错误:"在赋值中a()= b a和b中的元素数必须相同。"。所以,我做了必要的 - 在我看来 - 改变,我创建了我首先提出的代码。我不知道上面提到的两个中哪一个更好。

我的任务:完成computeCost.m文件中的代码 是一个计算J(theta)的函数。

提示:变量X和y不是标量值,而是矩阵表示训练集中示例的矩阵。同样,gradientDescent.m文件在computeCost.m文件执行后执行。让参数,函数和一般所有提到的未知数据都从不同的.txt文件中获取数据。

我绝望了,如果有人可以修复我的代码(以及我的问题),我将不胜感激。好吧,我该怎么办?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

J_history(:,iter) = computeCost(X, y, theta);应该做到这一点。您正在将列向量(computeCost的输出)分配给变量J_history。这意味着必须按列访问存储变量,前提是computeCost始终输出相同数量的列。如果不是这种情况,你将不得不研究单元格数组。

发生此错误是因为您尝试存储尺寸大于存储容器的内容。看起来就像你试图将你的24个啤酒瓶放在6个瓶子的箱子里,这是不适合的。 (从技术上讲,6需要在一行上才能适合这个例子,但它会这样做。)

所以,当你看到这个错误时你所做的是:

  • 在编辑器标签中选择db stop if error
  • 检查存储物品的大小
  • 检查容器的大小
  • 如果可能,请匹配两者,如果没有,请考虑另一种解决方案。