matlab如果循环功能,如何改进这个功能?

时间:2015-04-29 15:11:21

标签: matlab function matrix

我是matlab的新手,我正在尝试以智能/高效的方式编写以下函数。

首先,我创建一个带有条目y的矩阵HL,每一行都是预定义长度n的排列。

例如,对于n=3,我得到矩阵y : H H H的第一行。然后我想为每一行创建一个size n x n矩阵,例如,条目(1,2)对应于一个将y(1,1)项与y(1,2)y(3,2)相关联的变量。 1}}对应于将条目y(1,3)y(1,2)相关联的变量。这可能吗?

function A1=mystupidfunction(s , n)
%n is the number of agents and s is the number of state, this function
%returns the matrix of influence. Stupid code must be improved to work for
%n agents

x = 'HL';                 %// Set of possible types
K = n;                      %// Length of each permutation

%// Create all possible permutations (with repetition) of letters stored in x
C = cell(K, 1);             %// Preallocate a cell array
[C{:}] = ndgrid(x);
y = cellfun(@(x){x(:)}, C);
y = [y{:}];

A1 = sym('A1',[n n], 'positive' );
syms H L A_HH A_HL A_LH A_LL
for k=s
    for i=1:n
        for j=1:n
            if ( y(k,1)==H) && ( y(k,2)==H) && (y(k,3)==H)
                A1(i,j)=A_HH
            elseif ( y(k,1)==L) && ( y(k,2)==L) && (y(k,3)==L)
                A1(i,j)=A_LL
            elseif ( y(k,1)==H) && ( y(k,2)==L) && (y(k,3)==L)
                A1(1,1)=A_HH
                A1(1,2)=A_HL
                A1(1,3)=A_HL
                A1(2,1)=A_LH
                A1(3,1)=A_LH
                A1(2,2)=A_LL
                A1(2,3)=A_LL
                A1(3,3)=A_LL
                A1(3,2)=A_LL
            elseif ( y(k,1)==H) && ( y(k,2)==H) && (y(k,3)==L)
                A1(1,1)=A_HH
                A1(1,2)=A_HH
                A1(1,3)=A_HL
                A1(2,1)=A_HH
                A1(3,1)=A_LH
                A1(2,2)=A_HH
                A1(2,3)=A_HL
                A1(3,3)=A_LL
                A1(3,2)=A_LH
            elseif ( y(k,1)==L) && ( y(k,2)==L) && (y(k,3)==H)
                A1(1,1)=A_LL
                A1(1,2)=A_LL
                A1(1,3)=A_LH
                A1(2,1)=A_LL
                A1(3,1)=A_LH
                A1(2,2)=A_LL
                A1(2,3)=A_LH
                A1(3,3)=A_HH
                A1(3,2)=A_HL
            elseif ( y(k,1)==L) && ( y(k,2)==H) && (y(k,3)==H)
                A1(1,1)=A_LL
                A1(1,2)=A_LH
                A1(1,3)=A_LH
                A1(2,1)=A_HL
                A1(3,1)=A_HL
                A1(2,2)=A_HH
                A1(2,3)=A_HH
                A1(3,3)=A_HH
                A1(3,2)=A_HH
            elseif ( y(k,1)==L) && ( y(k,2)==H) && (y(k,3)==L)
                A1(1,1)=A_LL
                A1(1,2)=A_LH
                A1(1,3)=A_LL
                A1(2,1)=A_HL
                A1(3,1)=A_LL
                A1(2,2)=A_HH
                A1(2,3)=A_HL
                A1(3,3)=A_LL
                A1(3,2)=A_LH

            elseif ( y(k,1)==H) && ( y(k,2)==L) && (y(k,3)==H)
                A1(1,1)=A_HH
                A1(1,2)=A_HL
                A1(1,3)=A_HH
                A1(2,1)=A_LH
                A1(3,1)=A_HH
                A1(2,2)=A_LL
                A1(2,3)=A_HL
                A1(3,3)=A_HH
                A1(3,2)=A_HL
            else A(i,j)=0
            end
        end
    end
end

例如,当n=3s=1时,函数返回:

A =

[ A_HH, A_HH, A_HH]
[ A_HH, A_HH, A_HH]
[ A_HH, A_HH, A_HH]

备注:

C = cell(K, 1);             %// Preallocate a cell array
[C{:}] = ndgrid(x);         %// Create K grids of values
y = cellfun(@(x){x(:)}, C); %// Convert grids to column vectors
y = [y{:}];

输出是n = 3:     y =

HHH
LHH
HLH
LLH
HHL
LHL
HLL
LLL

s只是一个标量,表示矩阵y中的行数(对应于"状态")

0 个答案:

没有答案