Вот довольно эзотерическое решение, использующее преимущества специфической оптимизации MATLAB. Построить огромную матрицу 4k x 4k разреженную с вашими блоками 4x4 по диагонали. Тогда решай все одновременно.
На моей машине получается то же решение с точностью до одинарной точности, что и у @ Amro / Tom's for-loop, но быстрее.
n = size(A,1);
k = size(A,3);
AS = reshape(permute(A,[1 3 2]),n*k,n);
S = sparse( ...
repmat(1:n*k,n,1)', ...
bsxfun(@plus,reshape(repmat(1:n:n*k,n,1),[],1),0:n-1), ...
AS, ...
n*k,n*k);
X = reshape(S\repmat(B,k,1),n,k);
для случайного примера:
For k = 10000
For loop: 0.122570 seconds.
Giant sparse system: 0.032287 seconds.
Если вы знаете, что ваши матрицы 4x4 являются положительно определенными, то вы можете использовать chol
на S для повышения точности.
Это глупо . Но так же, как медленно в Matlab для циклов все еще в 2015 году, даже с JIT. Это решение, кажется, находит хорошее место, когда k не слишком велико, поэтому все по-прежнему помещается в память.