Несколько способов, которыми, как я понял, вы могли бы пойти:
% First define the MSE function
mse = @(x,y) sum(sum((x-y).^2))./numel(x);
Я большой поклонник использования bsxfun
для подобных вещей, но, к сожалению, он не работает с массивами ячеек. Итак, я позаимствовал форму одноэлементного расширения ответа из здесь.
% Singleton expansion way:
mask = bsxfun(@or, true(size(A)), true(size(B))');
idx_A = bsxfun(@times, mask, reshape(1:numel(A), size(A)));
idx_B = bsxfun(@times, mask, reshape(1:numel(B), size(B))');
func = @(x,y) cellfun(@(a,b) mse(a,b),x,y);
C = func(A(idx_A), B(idx_B));
Теперь, если это слишком безумно (или если явное создание массивов с помощью A(idx_A)
слишком велико), вы всегда можете попробовать циклический подход, подобный приведенному ниже.
% Or a quick loop:
results = zeros(length(A),length(B));
y = B{1};
for iter = 1:length(B)
y = B{iter};
results(:,iter) = cellfun(@(x) mse(x,y) ,A);
end
Если у вас закончилась память: подумайте о том, что вы выделяете: матрица двойников, состоящая из (232324 x 1024) элементов. (Это приличный объем памяти. В зависимости от вашей системы это может быть около 2 ГБ памяти...)
Если вы не можете хранить все это в памяти, вам, возможно, придется решить, что вы собираетесь делать со всеми MSE, и либо делать это в пакетном режиме, либо найти машину, на которой вы можете запустить полная симуляция/код включена.
EDIT Если вы хотите сохранить только сумму всех MSE (как указано в комментариях ниже), вы можете сэкономить память,
% Sum it as you go along:
results = zeros(length(A),1);
y = B{1};
for iter = 1:length(B)
y = B{iter};
results = results + cellfun(@(x) mse(x,y) ,A);
end
results =sum (results);
person
aepound
schedule
15.05.2015
{:,1}
‹- не уверен, что это правильно... - person Ander Biguri   schedule 15.05.2015class(trans_blk{1})
в консоли? также дляclass(ca{1})
? - person   schedule 15.05.2015