2014-01-05 1 views
1
A= [1 1 
    2 2 
    3 3 
    . . 
    . . 
    . . 
    N N] 

을 찾기가 나는 [N,2] 매트릭스를하고 난 [N/4,2] 서브 매트릭스의 일부 번호로 행 방향을 분할해야합니다. 그런 다음 각 서브 매트릭스에 대해 각 서브 매트릭스의 첫 번째 컬럼이 x 데이터이고 두 번째 컬럼이 y 데이터 인 선형 회귀 분석을 찾아야합니다. 출력은 필드 a, b, c, d .... 및 각 서브 매트릭스에 대한 선형 회귀 값을 가진 구조체 여야합니다.분할 매트릭스 행 방향 및 선형 회귀 COEFF

mat = mat2cell(A, [k k k k], [1 1]) 인 행을 mat2cell으로 먼저 분할했습니다.

다음을 어디서 fields = {'col1','col2'}

new = structfun(@(x)polyfit(x.col1, x.col2,1), out,'UniformOutput', false) 

를 사용 out = cell2struct(mat,fields,1)와 구조체에 매트를 변환 시도하지만 오류 얻을 :

Inputs to STRUCTFUN must be scalar structures. 

사람이 그것을 수행하는 방법을 알고 있나요을? 많은 감사

답변

0

가장 straightforawrd 방법 (그리고 아마도 가장 빠른이) 할이 좋은 오래된 for 루프입니다 :

A = [1:64;1:64]'; % Demo data 
m = 4; 
N = size(A,1); 
k = N/m;   % Assumes that length is evenly divisible by 4 

c = zeros(m,2); % Coefficients 
for i = 1:m 
    c(i,:) = polyfit(A((i-1)*k+1:i*k,1),A(i-1)*k+1:i*k,2),1); 
end 

또는 오히려 cell2struct 등을 사용하는 것보다 structfun 당신이 사용할 수있는 cellfun :

A = [1:64;1:64]'; % Demo data 
m = 4; 
N = size(A,1); 
k = N/m;   % Assumes that length is evenly divisible by 4 

c = cellfun(@(x)polyfit(x(:,1),x(:,2),1).',mat2cell(A,k+zeros(1,m),2),'UniformOutput',false) 

또는 대안

Ac = mat2cell(A,k+zeros(1,m),[1 1]) 
c = cellfun(@(x1,x2)polyfit(x1,x2,1).',Ac(:,1),Ac(:,2),'UniformOutput',false) 
,

당신이 매트릭스에 cellfun의 출력을 변환 할 수 있습니다 : 당신이 오류가 발생하는 이유에 대해서는

c = [c{:}].' 

, 당신의 변수 out은 4 별 1 구조체 배열 (구조의 배열)보다는이다 배열의 간단한 (스칼라) 구조. structfun에 대한 설명서는 짧은 함수에 대한 설명에서 "스칼라 구조의 각 필드에 함수를 적용하십시오."라는 점에서이 요구 사항을 지적합니다. 이 video from The MathWorks은 차이점을 설명하려고합니다.