Разделите каждый элемент в 2-мерном массиве - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть суммы координат x и y, и мне нужно вычислить среднее значение

float [][] sums = new float[n][2];

Например, мой массив состоит из:


{ [ 8,6 ],
  [ 4,2 ] }

После деления на 2:


{ [ 4,3 ],
  [ 2,1 ] }

Я могу сделать это с помощью циклов, но мне интересно, возможно ли это сделать с помощью 1 функции.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Вы можете просто заключить свои циклы for в функцию и вызвать ее:

import java.util.Arrays;

void setup(){

    float [][] sums = new float[][]{ { 8,6 },
                                     { 4,2 } };

    print("pre: ");
    System.out.println(Arrays.deepToString(sums));

    matMul(sums,0.5);

    print("post:");
    System.out.println(Arrays.deepToString(sums));
}

void matMul(float[][] data,float multiplier){
  for(int y = 0; y < data.length; y++){
    for(int x = 0; x < data[y].length; x++){
      data[x][y] *= multiplier;
    }
  }
}

Вот несколько указателей, если вы только начинаете работать с функциями.

Самая простая вещь функция, которая может сделать, - это инкапсулировать кучу инструкций, но не позволять читать какие-либо данные извне функции и не возвращать никаких данных.

Вот очень простой / скучный пример:

void sayHello(){
  println("hello");
}

Суть в том, чтобы ознакомиться с синтаксисом. Функция имеет:

  • (возвращаемый) тип: если функция возвращает какой-либо результат, что это за результат? (число, строка текста, объект и т. д. c.), если нет, то это просто void
  • имя (поэтому мы можем его назвать)
  • аргументы (0 или более) в скобках, каждый из которых имеет тип и имя (аналогично локальной переменной)
  • тело, разделенное символами { и }: все, что определено в этом блоке, видимо только этому блок (кроме того, что возвращается, если что-нибудь). Это называется областью действия функции

Возможно, вы уже определили функции, которые не возвращают результаты: void setup(){}, void draw(){}

Вы, вероятно, уже вызываемые функции раньше: использовали имя и аргументы (если они есть) в парантезе (например, println("hi");, point(50,50);, noCursor();, et c.)

Вот простой пример функции, которая принимает два входа и возвращает один выход: сумма входных данных:

int sum(int a, int b){
  return a+b;
}

Вместо void мы возвращаем результат типа int, а аргументы представляют собой пару целых чисел с именами a и b. Единственным дополнительным дополнением является ключевое слово return, которое используется (как вы уже догадались) для возврата результата (и выхода из функционального блока).

Вот базовый c пример вызова функции:

void setup(){
  println(add(2,2));
  println(add(4,4));
}

int add(int a, int b){
  return a + b;
}

Если вы хотите узнать больше об этом, ознакомьтесь с Обучающее руководство по созданию функций Кевина Воркмана

Имейте в виду, что метод void преобразует ссылку на массив для передачи в качестве аргумента функция. Могут быть ситуации, когда вы не хотите изменять входные данные, но возвращаете результат. В таком случае вы можете либо скопировать массив заранее и передать копию, либо иметь версию функции, которая делает копию для вас:

import java.util.Arrays;

void setup(){

    float [][] sums = new float[][]{ { 8,6 },
                                     { 4,2 } };

    print("sums:    ");
    System.out.println(Arrays.deepToString(sums));

    float[][] result = matMul(sums,0.5);

    print("result:  ");
    System.out.println(Arrays.deepToString(result));

    print("original:");
    System.out.println(Arrays.deepToString(sums));
}

float[][] matMul(float[][] data,float multiplier){
  // check input data
  if(data == null || data.length == 0){
    println("no data to multiply, returning null");
    return null;
  }
  // make another array of the same shape
  float[][] result = new float[data.length][data[0].length];
  // do the multiplcation, storing the result into the duplicate array
  for(int y = 0; y < data.length; y++){
    for(int x = 0; x < data[y].length; x++){
      result[x][y] = data[x][y] * multiplier;
    }
  }
  // return the result
  return result;
}

Обратите внимание на несколько проверок в начале функции: В общем случае, на всякий случай рекомендуется проверить данные, поступающие на экран, и отобразить сообщение, которое поможет легко решить проблему (не тратя много времени на выяснение, что означает ошибка).

0 голосов
/ 19 февраля 2020

Примерно так:

Arrays.stream(sums).map(y -> Arrays.stream(y).map(x -> x/2).toArray(Double[]::new))
.toArray(Double[][]::new);

, вероятно, должен делать то, что вы хотите.

...