【问题标题】:Converting 1D to 2D?将一维转换为二维?
【发布时间】:2012-08-15 21:45:11
【问题描述】:

这似乎是一个愚蠢的问题,但它真的让我很烦恼。

基本上,我有一个需要将其转换为二维数组的一维数组。基本上,数组的大小是:62017 现在从这个,我需要得到这个的行和列。但是,动态地执行此操作,例如,它会采用 43101 的数量,然后建立行+列,然后相应地重新调整向量的大小。

我希望我已经解释得够多了,希望有人能提供帮助,谢谢:)

【问题讨论】:

  • 62017 是素数,你不能将它平均分成行和列。
  • 我就是这么想的..有什么办法吗?我需要将其变为偶数,基本上,向量包含 0,所以删除这些 0 可能会减小大小?
  • 另一方面,43101 可以拆分为 3x143679x4789。您需要提供至少一个维度的大小。
  • 这当然可以。如果你想确保没有“空”单元格,并动态计算,你有时会得到只有 1 宽的“二维数组”。 @user1582478 您是否正在寻找生成此代码的确切代码?
  • 我认为如果你想要一个答案,你将不得不更具描述性(示例伪代码很有帮助)。还有,这是作业吗?

标签: c++ arrays c++11


【解决方案1】:

这里是老式数组样式(因为我目前无法访问 C++0x 编译器)

#include <iostream>
//#include <array>
#include <inttypes.h>
#include <math.h>

void calc_new_sizes(const size_t old_size, size_t& new_size1, size_t& new_size2)
{
    new_size1 = 1;
    new_size2 = 1;
    size_t stop_at = (size_t)sqrt(old_size) + 1;
    for (size_t i = 1; i<stop_at; i++)
    {
        if ( old_size % i == 0 )
        {
            new_size1 = i;
            new_size2 = old_size / i;
        }
    }
}

template <class T>
T** twoDimensionify(T* p_old_array, const size_t old_size)
{
    size_t new_size1=1, new_size2=1, old_i=0;
    calc_new_sizes(old_size, new_size1, new_size2);
    T** returnValue = new T*[new_size1];
    for (size_t i=0; i<new_size1; i++)
    {
        returnValue[i] = new T[new_size2];
        for (size_t j=0; j<new_size2; j++)
        {
            returnValue[i][j] = p_old_array[old_i];
            old_i++;
        }
    }
    return returnValue;
}

int main()
{
    size_t old_size=20, new_size1=0, new_size2=0;
    calc_new_sizes(old_size, new_size1, new_size2);
    std::cout << "From " << old_size << " to " << new_size1 << "x" << new_size2 << std::endl;

    int old_array[20] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
    int **new_array = twoDimensionify<int>(old_array, 20);
    for (size_t i=0; i<new_size1; i++)
    {
        for (size_t j=0; j<new_size2; j++)
        {
            std::cout << "new array[" << i << "," << j << "] = " << new_array[i][j] << std::endl;
        }
    }

    // Clean up my memory.  This is C++ afterall.
    for (size_t i=0; i<new_size1; i++)
    {
       delete [](new_array[i]);
    }
    delete []new_array;
    return 0;
}

【讨论】:

    【解决方案2】:

    我相信您正在寻找这样的东西。尽管在访问正确的编译器时遇到了一些挑战,但我无法验证...

    #include <iostream>
    #include <array>
    #include <inttypes.h>
    #include <math.h>
    
    void calc_new_sizes(const size_t old_size, size_t& new_size1, size_t& new_size2)
    {
        new_size1 = 1;
        new_size2 = 1;
        size_t stop_at = (size_t)sqrt(old_size) + 1;
        for (size_t i = 1; i<stop_at; i++)
        {
            if ( old_size % i == 0 )
            {
                new_size1 = i;
                new_size2 = old_size / i;
            }
        }
    }
    
    
    template <class T, size_t new_size_1, size_t new_size_2, size_t old_size>
    std::array<new_size_1, std::array<T, new_size_2>> twoDimensionify(std::array<T, old_size> p_input)
    {
        std::array<new_size_1, std::array<T, new_size_2>> returnValue;
        int old_i = 0;
        for (int i=0; i<new_size_1; i++)
        {
            for (int j=0; j<new_size_2; j++)
            {
                returnValue[i][j] = p_input[old_i];
                old_i++;
            }
        }
    
        return returnValue;
    }
    
    int main()
    {
        size_t old_size=20, new_size1=0, new_size2=0;
        calc_new_sizes(old_size, new_size1, new_size2);
        std::cout << "From " << old_size << " to " << new_size1 << "x" << new_size2 << std::endl;
    
        return 0;
    }
    

    【讨论】:

    • 嘿,非常感谢你 :)!再问一个问题.. 结果显示:行:1,列:62017 ... 那么我可以将其分成多少块?还是不会是偶数吧?
    • @user1582478 想想你的数学因素。正如所指出的,我相信 62017 是一个素数,所以它的唯一因素是 1x62017,这是你唯一的选择。像 20 这样的东西会有 1x20、2x10 和 4x5。您实际上可能会问与我不同的问题,尽管在最后一行中有空单元格,例如:1000 行使用其中的 63 个,在最后一行中仅使用 1000 个中的 17 个。这是你的要求吗?
    • 嘿,我想我明白你的意思了。基本上,我在做信号处理和声音。我需要将大量样本分成相等的块,以便我可以分析它们,但是,根据我得到的数据大小,甚至很难开始思考我可以分割什么块进。我创建了一个算法,将 512*512 向量拆分为 16*16 块等块,但显然,我无法在这个项目中使用该代码。有什么想法吗?
    • @user1582478 我建议对不同类型使用固定大小。例如,对于音频,您会遇到某些编解码器,每帧总是使用相同的字节数,因此您需要使用它的倍数。
    • 抱歉让我感到困惑,类型是什么意思?所以我应该乘以我必须允许所有帧的数量?但是,将样本分成块仍然是一个真正的问题。我错过了重点吗?
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 2016-02-18
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多