Как добавить все элементы в двумерный массив по кругу? - PullRequest
2 голосов
/ 03 мая 2020

Учитывая 2d массив строк, как мне сложить все элементы, чтобы каждый индекс в массиве был суммой остальной части массива? Например, с массивом [[a], [b], [c], [d], [e]] я получаю
[[a+b+c+d+e], [a+b+c+d+e], [a+b+c+d+e], [a+b+c+d+e],[a+b+c+d+e]]. Я предполагаю, что это не должен быть 2d массив, это может быть 1d массив строк, и я получаю строку «a + b + c + d + e» в каждом индексе. Когда я говорю циркулярно, я имею в виду циклы, без дополнительной памяти Поэтому, возможно, после первой итерации это может выглядеть примерно так: [[a], [a + b], [a+b+c], [a+b+c+d], [a+b+c+d+e]]. Каким будет код для чего-то подобного? Ответ может быть psuedocode или любым языком

примерно так: https://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/

Ответы [ 3 ]

2 голосов
/ 03 мая 2020

По вашей прикрепленной ссылке, думаю, вам поможет следующее решение:

        int n = 5, i, j;
        String[][] gpu = new String[n][n];
        //here generate initial gpu....
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                char ch = (char) (97 + j);
                gpu[i][j] = ""+ch+i;
            }
        }
        System.out.println("Initial Gpu: ");
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(gpu[i][j] + "|");
            }
            System.out.println();
        }
        // here calculated your expected logic
        for (i = 0; i < n-1; i++) {
            for (j = 0; j < n; j++) {
                gpu[(i+j+1)%n][j] = gpu[(i+j)%n][j] + gpu[(i+j+1)%n][j];
            }
        }
        System.out.println("Final Gpu: ");
        for (i = 0; i < n; i++) {
            System.out.print(gpu[n-1][i] + "|");
        }
        System.out.println();
1 голос
/ 03 мая 2020

Вы можете получить такую ​​строку, добавив все элементы к одному из элементов, а затем скопировав результат в другие элементы.

    String[] arr = new String[] {"a", "b", "c", "d", "e"};

    for(int i = 1; i < arr.length; ++i) {
        arr[0] += arr[i];
    }
    for(int i = 1; i < arr.length; ++i) {
        arr[i] = arr[0];
    }       
    System.out.println(Arrays.toString(arr));
1 голос
/ 03 мая 2020

Я не совсем уверен, чего вы хотите достичь. Но это может быть полезно, если вы посмотрите на Arrays#parallelPrefix, который вы можете использовать для накопления отдельных элементов массива.

public static void main(String[] args) {
    String[] str = {"a","b","c","d","e"};
    Arrays.parallelPrefix(str, (s1,s2) -> s1+s2);
    System.out.println(Arrays.toString(str));
}

//[a, ab, abc, abcd, abcde]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...