2017-02-17 16 views
0

У меня есть такая функция, которая принимает lnn1c(ii, j, n, n1) индексирует ii и jj в качестве аргументов, где Kdk1 и Wdg являются некоторыми массивами, wg(n) другой функция своего рода alpha*(n-3) и Gdg является символическим переменным.Возможны ли символические индексирования в Matlab?

function lnn1c=lnn1c(ii, j, n, n1) 
    syms k1Vzdg 
    global Gdg Wdg Kdk1 
    lnn1c=Gdg-i*(-(Wdg(ii)-Wdg(j))+(wg(n)-wg(n1))+... 
     (Kdk1(ii)-Kdk1(j))*k1Vzdg); 
end 

Я хочу выступить в моем сценарии суммирования выражения lnn1c(ii, j, n, n1) над индексами ii и j от 1 до 4. я попробовал такой код

syms ii jj n n1 
sum(subs(sum(subs(lnn1c(ii, jj, n, n1), ii, 1:4)),jj, 1:4)) 

, но я получаю такую ​​ошибку

Indexing input must be numeric, logical or ':'.

Любая помощь была бы действительно ценной для меня.

+1

Примечание: создание символических переменных, которые будут возвращены и глобалам * внутри * функция страшная мысль. Все подсказки, которые вам нужно переписать в коде более умным способом, или вы найдете больше проблем. Также обратите внимание, что как 'i' - это мнимая единица, поэтому ее' j'. Написание 'ii', чтобы избежать этого, но затем писать' j' не решает проблему! –

ответ

0

Нет, символическое индексирование не имеет смысла.

Однако вы можете смешивать идеи. Вы эффективно делаете subs(f(ii, jj, n, n1), ii, 1:4). Вы положили ii, а затем замените его на 1: 4. Почему бы не поставить 1:4 в качестве входных данных?

Вобще:

for jj=1:4 
    s=s+sum(lnn1c(1:4, jj, n, n1)); 
end 

Конечно, вы будете нуждаться в числовые значения для n и n1 .... Как вы не показали весь код, его трудно понять, что вы делаете, но являются намеками на то, что вам вообще не нужны символические математики, и вы просто смешиваете концепции программирования.

0

Как Ander указывает, что вы можете сделать это в два для петель, и вы не будете иметь никаких проблем:

s=0; 
for jj=1:4 
    for ii=1:4 
    s=s+sum(lnn1c(ii, jj, n, n1)); 
    end 
end 

Однако, если ваше намерение состоит в том, чтобы сделать это в 1 строке, почему вы не попробуйте arrayfun?

s=sum(arrayfun(@(ii) sum(arrayfun(@(jj) lnn1c(ii, jj, n, n1),1:4),1:4)); 

И нет необходимости в Симс;)

+0

ваше одно решение не работает. Он выдает сообщение об ошибке: Ошибка при использовании arrayfun Тип вывода sym в настоящее время отсутствует . – David