可以内联定义一维图像吗?

Can one define a one dimensional image inline?

我想描述一个长度为 2 的非常简单的图像(实际上是一个向量),例如 (1,2) 用于某些线性代数的目的。 下面创建一个 y 轴长度为 1 的二维图像:

image a := [2,1]: {
    {1, 2}
}
MatrixPrint(a)

这输出

{
{1, 2}
}

我如何以类似的方式输出它?

{123,45}

此外,如果我有任意形状的图像 (a, b),我如何将其切片以提取值 n 的一维图像,沿 x 轴或 y 轴? (沿其中一个图像轴提取线轮廓)

在您的示例中,您 定义了 2D 图像,因此您获得了 2D 输出。如果图像真的是一维的,你的输出将是一维的,即

image a := [2]: {123, 45}
MatrixPrint(a)

所以你的第二个问题实际上是你第一个问题的答案:你需要对数据进行一维切片,你可以使用命令 slice1() 来完成,如下所示:

image a := [2,1]: {
    {123, 45}
}
MatrixPrint( a.slice1(0,0,0,0,2,1) )

注意命令的一些特殊性:

  • 该命令始终假设 输入是 3D,因此前 3 个参数是起始索引三元组 x/y/z,即使它只是 2D 或 1D 数据。
  • 第二个三元组指定切片的采样。首先是维度索引 (0=x),然后是采样步数 (2),然后是步长 (1)

2D 切片、3D 切片和来自 nD 数据的 nD 切片存在类似的切片命令。


matrixPrint命令只输出到结果window。无法将其重新路由到某个字符串。但是,您可以轻松地为自己创建一个可以做到这一点的方法(尽管对于大数据来说不是很快):

string VectorPrint( image img, string FormatStr, number maxNum )
{
    if ( !img.ImageIsValid() ) return "{invalid}"
    if ( 1 != img.ImageGetNumDimensions() ) return "{not 1D}"

    string out = "{ "
    number nx = img.ImageGetDimensionSize(0)

    if (( nx <= maxNum ) || ( maxNum <= 2) )
    {
        for( number i=0; i<min(nx,maxNum); i++)
            out += Format( sum(img[0,i]), FormatStr ) + ", "

        out = out.left( out.len() - 2 )
    }
    else 
    {
        for( number i=0; i<maxNum-1; i++)
            out += Format( sum(img[0,i]), FormatStr ) + ", "

        out = out.left( out.len() - 2 ) + ", ... , "
        out += Format( sum(img[0,nx-1]), FormatStr )
    }

    out += " }"
    return out

}

image a := [10,4]: {
    {1,2,3,4,5,6,7,8,9,10},
    {123, 45, 12.3, -12, 55, 1.2, 9999, 89.100, 1e-10, 0},
    {0,0,0,0,0,0,0,0,0,0},
    {1,2,3,4,5,6,7,8,9,10}
}

// Slice 2D image to 1D image at n'th line
number n = 1
image line := a.slice1(0,n,0,0,a.ImageGetDimensionSize(0),1)

// Printout with given number format and a maximum number of entries
string fStr = "%3.1f"
number maxN = 3
Result( "\n "+VectorPrint( line, fStr, maxN ) )