ОШИБКА MATLAB В КОМАНДЕ PINV

я использую код для поверхностной аппроксимации триангуляции, который скопирован здесь

[totalTris,three] = size(tri);
[totalPoints,two] = size(registeredPts);

%   1. Find the 3 equations for each vertex, and
%      place them in c_equations matrix;
% c_equations = [A for vertex 1;
%                A for vertex 2; ...
%                A for vertex totalPoints]
% c(point,row,:) gives one row from an A matrix
Btotal = zeros(3,totalPoints);
c_equations = zeros(3*totalPoints,3,9);
for pointNum = 1:totalPoints
    % B = [pixVal; x gradient; y gradient] at this vertex
    z = pixelVals(pointNum);
    B = [z; vGradientVecs(pointNum,1); vGradientVecs(pointNum,2)];

    % Compile all B matrices into a vector
    Btotal(:,pointNum) = B;

    % B = Ac
    x = registeredPts(pointNum,1);
    y = registeredPts(pointNum,2);
    A = [1   x   y   x^2  y^2  x^3     (x^2)*y  x*(y^2)  y^3; ...
         0   1   0   2*x   0   3*(x^2)  2*x*y   y^2      0; ...
         0   0   1   0    2*y  0        x^2     2*x*y    3*(y^2)];

    % Compile all A matrices into a vector
    c_equations(pointNum,1,:) = A(1,:);
    c_equations(pointNum,2,:) = A(2,:);
    c_equations(pointNum,3,:) = A(3,:);
end

%   2. Find the c values for each triangle patch
c = zeros(totalTris,9);
c9 = zeros(9,9);
for triNum = 1:totalTris
    p1 = tri(triNum,1);
    p2 = tri(triNum,2);
    p3 = tri(triNum,3);

    B9 = [Btotal(:,p1); Btotal(:,p2); Btotal(:,p3)];
    c9 = [c_equations(p1,1,:); c_equations(p1,2,:); c_equations(p1,3,:); ...
          c_equations(p2,1,:); c_equations(p2,2,:); c_equations(p2,3,:); ...
          c_equations(p3,1,:); c_equations(p3,2,:); c_equations(p3,3,:)];
    c(triNum,:) = pinv(c9)*B9;   %linsolve(c9,B9);
end

end

это часть более крупного кода, когда я запускаю код, он выдает следующие ошибки в MATLAB

Error using svd
Input must be 2-D.

Error in pinv (line 29)
   [U,S,V] = svd(A,0);
Error in findBPolyCoefficients (line 50)
    c(triNum,:) = pinv(c9)*B9;

Согласно моему поиску, у меня есть правильный синтаксис pinv, ошибка «Ввод должен быть 2D» выходит за рамки моего понимания, если кто-нибудь может сказать мне, как решить эту проблему.


person Jav    schedule 11.12.2013    source источник
comment
какой размер c9? Сделайте size(c9) в MATLAB и вставьте сюда.   -  person Autonomous    schedule 11.12.2013
comment
я сделал size(c9) и получил 9 1 9 .я должен пройти этот c9,из него я понимаю что это 9 матриц по 9 строк и 1 столбец не знаю прав ли я   -  person Jav    schedule 11.12.2013


Ответы (1)


Согласно предоставленной вами информации, похоже, что c9 является тривиальной трехмерной матрицей, т.е. ее второе измерение равно единице. такие размеры называются одноэлементными размерами. Squeeze — это команда, используемая для свертывания таких измерений. Вы должны просто сделать,

c9=squeeze(c9); %before doing pinv

Это сделает c9 двумерной матрицей, после чего можно будет вычислить ее SVD.

person Autonomous    schedule 11.12.2013
comment
спасибо, вы сделали мой день :) после этого код заработал - person Jav; 11.12.2013
comment
@Jav Просто подтвердите, что c9, которое вы получаете с помощью squeezing, дает вам желаемый конечный результат. Возможно, это устранило ошибку, но вам все равно нужно проверить, правильно ли это. - person Autonomous; 11.12.2013
comment
я не могу получить правильные результаты для кода ma, финальное изображение вызывает проблемы, я думаю, это из-за него, но когда я найду реальную причину, я обновлю - person Jav; 05.01.2014