【问题标题】:How to make a for loop stop after a set number of iterations in Julia如何在 Julia 中进行一定次数的迭代后停止 for 循环
【发布时间】:2021-10-13 22:59:19
【问题描述】:

我在编程方面还是个新手,如果能提供有关如何解决以下问题的任何帮助,我将不胜感激:

给定一个矩阵 (3x5)

a = [1 2 3 4 5; 
     6 7 8 9 10; 
     11 12 13 14 15;]
  1. 我想遍历每一行
  2. 对于每一行,我希望检查每个元素
  3. 对于每个元素,我想存储一个单独的数组来保存该元素和接下来的 2 个元素。

例如:

Row 1 = [1 2 3 4 5]
For element 1
return newArray = [1 2 3]

For element 2
return newArray = [2 3 4]

卡在第 3 部分。如何使 for 循环仅检查接下来的 2 个元素,然后继续检查该行中的下一个元素。

【问题讨论】:

  • 元素 4 和 5 会发生什么?该行中将有
  • 抛开具体的代码实现,“编程”的第一个里程碑就是明确定义程序应该完成的任务。尝试发布一些伪代码...

标签: for-loop matrix julia


【解决方案1】:

我尝试解决您的要求,但我同意其他人的观点,即您需要更多地考虑您正在尝试做的事情以及您希望输出的样子。您的请求听起来不像初学者程序员会实际使用的东西。我不确定您要将“单独的数组”存储在什么形状中。我有以下选项可以将它们保存在矢量或 a 的原始形状中。

function nexttwo(row, i)
    newarray::Vector{Any} = [row[i]]
    for j=1:2
        i+=1
        if length(row) >= i
            push!(newarray, row[i])
        else
            push!(newarray, nothing)
        end
    end
    return newarray
end    

function collectnexttwo(a)
    result_collection = []
    for i in axes(a,1)
        for j in axes(a,2)
            row = a[i,:]
            newarray = nexttwo(row, j)
            push!(result_collection, newarray)
        end
    end
    return result_collection
end

function restoreshape(v, a)
    permutedims(reshape(v, reverse(size(a))))
end
julia> a = [1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15;]
3×5 Matrix{Int64}:
  1   2   3   4   5
  6   7   8   9  10
 11  12  13  14  15

julia> result = restoreshape(collectnexttwo(a), a)
3×5 Matrix{Any}:
 Any[1, 2, 3]     Any[2, 3, 4]     Any[3, 4, 5]     Any[4, 5, nothing]    Any[5, nothing, nothing]
 Any[6, 7, 8]     Any[7, 8, 9]     Any[8, 9, 10]    Any[9, 10, nothing]   Any[10, nothing, nothing]
 Any[11, 12, 13]  Any[12, 13, 14]  Any[13, 14, 15]  Any[14, 15, nothing]  Any[15, nothing, nothing]

【讨论】:

  • 谢谢大家,我尝试按照建议重组问题,并且能够以与您类似的方式工作。
【解决方案2】:

我认为您在陈述您想要实现的目标时存在一些问题。这通常会使编程任务变得更加困难。

重申你已经拥有的:

  1. 我想遍历每一行

这很简单

for row = 1:size(a)[1]
 ...
end
  1. 对于每一行,我希望检查每个元素

这就是事情开始变得糊涂的地方? “检查”是什么意思。假设您有一个名为 checkElement 的函数。

  1. 对于每个元素,我想存储一个单独的数组来保存该元素和接下来的 2 个元素。

你希望那个单独的数组存在多久?你只想持有3个元素吗?或者原始每个单元格的三个元素(即,对于您显示的 3x5 输入具有 3x5x3 结果)

另外,你想对每行中的元素 4 和 5 做什么?你想为他们的“下一个”元素使用什么值?您可以将缺失用作值或 NaN。或者您可以使结果不包含有问题的输入。

如果您回答了这些问题,您可能会发现编写所需的代码会容易得多。

【讨论】:

  • for row = size(a)[1] 不幸的是,这没有意义,因为这将遍历单个数字。您可以使用for row in 1:size(a,1),但最好使用for row in axes(a, 1)
  • @DNF 你是对的。我删除了1:(已编辑以修复错字)。您的建议对于一般情况更有效,但对于密集矩阵的示例同样有效。谢谢你的鹰眼,顺便说一句。
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2020-07-13
  • 1970-01-01
  • 2019-11-16
相关资源
最近更新 更多