【问题标题】:For loop and matrix indexing in matlab ques [closed]对于matlab ques中的循环和矩阵索引[关闭]
【发布时间】:2013-09-11 08:38:28
【问题描述】:

我通过使用for循环定义了一个等于0的矩阵(initial_matrix):

I = 5;   % e.g number of nodes
for i =1:I
    initial_matrix = [0];    // an initial matrix will be generated for each node
end

现在,对于每个节点 i,我将考虑所有其他节点,但不考虑节点 i 本身,然后将每个节点从 1 中减去并取它们的乘积:

对于节点 1:

result = (1 - initial_matrix of node 2) * (1 - initial_matrix of node 3) * ...
    (1 - initial_matrix of node 4) * (1 - initial_matrix of node 5)

对于节点 2:

result = (1 - initial_matrix of node 1) * (1 - initial_matrix of node 3) * ...
    (1 - initial_matrix of node 4) * (1 - initial_matrix of node 5)

对于节点 3:

result = (1 - initial_matrix of node 1) * (1 - initial_matrix of node 2) * ...
    (1 - initial_matrix of node 4) * (1 - initial_matrix of node 5) 

等等..剩下的 2 个节点!

谁能告诉我或提示我如何实现这一目标?谢谢!

【问题讨论】:

  • 这很难理解。你能举个例子吗?
  • @丹。上面的例子是考虑节点 1 的情况。现在,如果我考虑节点 2:那么我应该得到:结果 =(1 - 节点 1 的初始矩阵)*(1 - 节点 3 的初始矩阵)* ...(1 - 节点 4 的初始矩阵)*(1 - 节点的初始矩阵5) ....对于节点 3 等类似
  • 这不是一个例子。如果下面的答案不是您想要的,您应该在您的问题中添加(即不是评论)一个数字小型工作示例
  • 你真的想要矩阵乘积还是元素乘积?

标签: matlab loops matrix-indexing


【解决方案1】:

对于每个产品(每个节点),您需要提前拥有所有初始矩阵,因此您应该将初始循环修改为以下几行:

initial_matrix = cell(I, 1);
for i = 1:I
    initial_matrix{i} = blah blah... %// Generated for each node
end

然后您可以添加另一个嵌套循环,执行如下操作:

result = cell(I, 1);
for k = 1:I

    %// Compute product
    result{k} = 1;
    for n = setdiff(1:I, k)
        result{k} = result{k} * (1 - initial_matrix{n});
    end
end

【讨论】:

  • @ Eitan T,但这不会在节点 2 上运行,依此类推。因为节点 1 我会考虑 2、3、4 和 5,然后对于节点 2:1、3、4 和5,对于节点3:1,2,4和5....等等....
  • 那么对于每个节点,您要考虑除自身之外的所有节点吗?请花时间将这个缺失的信息添加到问题中。
  • 是的,我想考虑所有节点都期望有问题的节点!
  • @user2762192 我已经更新了答案。
  • @EitanT:好的。我正在检查代码
【解决方案2】:

我认为这些是您需要采取的步骤:

假设所有矩阵的大小相同,并且您希望进行元素乘法:

  1. 将它们全部连接成一个大矩阵initialMatrices,如desribed here.
  2. 1-initialMatrices 上申请cumprod
  3. 如果您使用了cumprod,则从此结果中提取您需要的矩阵

一些注意事项:

  • 可能通过减一或删除来预处理第一个初始矩阵。
  • 确保在正确的“方向”上构建总矩阵。检查help cumprod 的正确方向。

【讨论】:

    【解决方案3】:

    目前,您没有为每个节点创建初始矩阵。如果您想为每个单独一个,我建议您定义一个结构。所以你将拥有:

    I = 5;
    for i =1:I
        initial_matrix.(sprintf('Node%d',i)) = [0];    % an initial matrix will be generated for each node
    end
    

    那么您也许可以执行以下操作来执行您的操作(如果我理解正确的话):

        for i =1:I
            numnode=[1:I]
            numnode(numnode==i)=[]
            for ind = 1:numel(numnode)-1
                NewMatrix.(sprintf('Node%d',i)) = (1- initial_matrix.sprintf('Node%d',numnode(ind))))*(1- initial_matrix.(sprintf('Node%d',numnode(ind+1))))
                end
        end
    

    您可以在定义 initial_matrix 时使用rand(1) 语句而不是[0] 来验证这是否正确。

    希望我理解正确

    【讨论】:

    • 但是做乘法的部分在哪里?
    • @Eitan 刚刚意识到我的错误并对其进行了修改。现在应该成倍增加。
    • 还有一件事:虽然它确实有效,但在我看来,使用结构和动态引用是不必要的过度复杂化。在这里使用元胞数组肯定会更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2018-03-26
    • 2021-05-30
    相关资源
    最近更新 更多