Как заставить Accumarray работать с массивом Struct?

Можно ли это сделать? По сути, у меня есть массив структур val (содержит список моей пользовательской структуры), и я хочу умножить все элементы вместе, используя пользовательскую функцию умножения Multiply, и я не хотите использовать цикл.

Я пытался использовать accumarray(indx, val', [1 1], @Multiply) с indx=ones(lengths(val), 2), но это не работает (по крайней мере, для Octave 3.4.3). При выполнении внутри моей функции C=Multiply(A,B) A передается весь массив структур, а B пуст вместо того, чтобы A был первым элементом массива, а B - вторым элементом, как в обычном случае.

Надеюсь, я ясно выразился здесь. Спасибо


person Dryland    schedule 13.10.2012    source источник
comment
Умножение работает только с одним полем структуры?   -  person Andrey Rubshtein    schedule 14.10.2012
comment
Итак, если бы val был массивом структур 1 на 4, хотели бы вы, чтобы ваш результат был эквивалентен C = Multiply(Multiply(Multiply(val(1), val(2)), val(3)), val(4));?   -  person gnovice    schedule 09.06.2017


Ответы (1)


Я не уверен, что вы хотели сделать. Я разработал некоторый код, связанный с тем, что вы ожидали:

val = 101:105;
strct_template.index = 1;
strct_template.b = 1;
strct_array = repmat(strct_template,length(val),1);

for i=1:length(val)
    strct_array(i).index = i;
    strct_array(i).b = val(i);
end

subs = [1; 2; 4; 2; 4];
sum_example = accumarray(subs, vertcat(strct_array.b)) % example from accumarray in matlab help 
mult_example = accumarray(subs, vertcat(strct_array.b),[],@prod)
subs = ones(length(strct_array),1);
mult_example2 = accumarray(subs, vertcat(strct_array.b),[],@prod) % I suppose you wanted this
mult_example3 = prod(vertcat(strct_array.b)) % which gives the same result as this

Я впервые использую функцию accumarray, поэтому, возможно, я неправильно понимаю, что вам нужно. Надеюсь, я смог помочь,

person jespestana    schedule 14.10.2012
comment
Спасибо, но это не то, что я хочу. Потому что мой '@Multiply' делает много других вещей с разными полями в структуре (не только умножает число, как в вашем коде). Итак, 1) я не могу использовать '@prod' 2) я должен передать всю структуру в качестве второго аргумента, и это, похоже, не работает. - person Dryland; 15.10.2012
comment
Я много раз сталкивался с проблемами, подобными вашей. Я думаю, что с массивами ячеек и массивами структур у вас нет другого варианта, кроме использования цикла for... Трюк vertcat() полезен для объединения значений только в одном поле массива структур. Давайте посмотрим, есть ли у кого-нибудь хороший ответ на ваш вопрос; Мне любопытно посмотреть, работает ли он также с массивами ячеек... - person jespestana; 15.10.2012