Tutaj jest rozwiązanie wykorzystujące bsxfun
A = magic(3);
T = [-1 1]
T = diag(T);
M=bsxfun(@times,permute(A,[3,1,4,2]),permute(T,[1,3,2,4]));
M=reshape(M,size(T).*size(A));
Tworzy 4D tabeli, w której poszczególne bloki to M(:,i,:,j)
, to jest przekształcony do macierzy 2D.
Przybornik przetwarzania obrazu zapewnia inne rozwiązanie, które jest bardzo krótki, ale powolny:
A = magic(3);
T = [-1 1]
T = diag(T);
M=blockproc(A,[1 1],@(x) x.data.*T);
I wreszcie realizacja który generuje macierz rzadką, co może być pomocne dla dużego T jak twoja matryca będzie zawierać wiele zer:
T=[-1 1];
A=magic(3);
%p and q hold the positions where the first element element is stored. Check sparse(p(:),q(:),A(:)) to understand this intermediate step
[p,q]=ndgrid(1:numel(T):numel(T)*size(A,1),1:numel(T):numel(T)*size(A,2));
%now p and q are extended to hold the indices for all elements
tP=bsxfun(@plus,p(:),0:numel(T)-1);
tQ=bsxfun(@plus,q(:),0:numel(T)-1);
%
tA=bsxfun(@times,A(:),T);
M=sparse(tP,tQ,tA);
Gdy T ma rozmiar nx1, rzadkie rozwiązanie zmniejsza zużycie pamięci o współczynnik około n/1,55.
Czy to możliwe, że szukasz komendy Kron? http://de.mathworks.com/help/matlab/ref/kron.html – bdecaf
Czy nie otrzymasz zamiast tego macierzy o rozmiarze 'NTn x V', gdzie' Tn' to 'size (T, 1) 'ponieważ' diag (T) 'miałby być' size (T, 1) '? – Divakar