我正在生成hadamard矩阵,对于任何2d矩阵“M”,下一个矩阵是:
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Klient
*
* @ORM\Table(name="klient")
* @ORM\Entity(repositoryClass="AppBundle\Repository\KlientRepository")
*/
class Klient
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nazwa", type="string", length=255, unique=true)
*/
private $nazwa;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\User", mappedBy="klient")
*/
private $users;
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set nazwa
*
* @param string $nazwa
*
* @return Klient
*/
public function setNazwa($nazwa)
{
$this->nazwa = $nazwa;
return $this;
}
/**
* Get nazwa
*
* @return string
*/
public function getNazwa()
{
return $this->nazwa;
}
public function __construct()
{
$this->users = new ArrayCollection();
}
}
e.g。
Matrix以1x1矩阵开头,值为“1”,这样:
M, M
M,-M
依旧...... see here
所以我有一个类型:
1 (x) 1, 1 = 1, 1
1,-1 1,-1
1, 1 (x) 1, 1 = 1, 1, 1, 1
1,-1 1,-1 1,-1, 1,-1
1, 1,-1,-1
1,-1,-1, 1
在我的构造函数中,我将矩阵设置为起始值:
typedef std::vector<std::vector<char>> matrix_t;
因此,为了制作下一个矩阵,我决定复制行(重复复制),然后复制完整的矩阵(再次重复复制):
hadamard::hadamard() :
m_matrixvoid hadamard::generate_next(matrix_t& matrix, size_t size)
{
if (matrix.size() < size)
{
hadamard::print_matrix(matrix, "before");
// Copy the matrix into 4: M1 | M2
// ---+---
// M3 | M4
// For each inner vector - copy it (double up)
for(auto& row : matrix)
{
// Double up the row
row.insert(row.end(), row.begin(), row.end());
}
// For the outer vector - copy it (double up)
matrix.insert(matrix.end(), matrix.begin(), matrix.end());
// Invert chars in M4 (see diagram above)
TODO
hadamard::print_matrix(matrix, "after");
// Ok, feeling brave, now call recursively...
generate_next(matrix, size);
}
}
{
}
为了完整起见,这是我的打印功能:
static void print_matrix(matrix_t& matrix, const char * title)
{
printf("%s\r\n", title);
printf("Dimensions - rows: %d, cols: %d\r\n", matrix.size(), matrix[0].size());
int row = 1;
for(auto& line : matrix)
{
printf("NEW LINE\r\n");
int col = 1;
for (auto& item : line)
{
printf("item(%d, %d): %d\r\n", row, col, item);
++col;
}
++row;
}
}
我得到的输出是这样的:
before
Dimensions - rows: 1, cols: 1
NEW LINE
item(1, 1): 1
after
Dimensions - rows: 2, cols: 2
NEW LINE
item(1, 1): 1
item(1, 2): 1
NEW LINE
<HERE SHOULD BE A COPY OF THE PREVIOUS "LINE">
你可以从输出中看到内部副本工作正常 - 我想这是因为我正在研究std :: vector所以内部数据是字符。
但是外部副本不起作用,我认为这个向量是“向量的向量”(完整类型是std::vector<std::vector<char>>
)。
所以基本上就行:
// For the outer vector - copy it (double up)
matrix.insert(matrix.end(), matrix.begin(), matrix.end());
看起来似乎是matrix
的两倍,但它不会复制数据。
为什么不复制数据? - 是因为需要深层复印吗? 另外,这是一种有效的方法吗?
与此同时,我将手动复制每行的数据......只是为了向自己证明我能做到!
更新
好吧,我“想”我有一个非常简单的修复......可能不是最好的方法吗?
for(auto& row : matrix)
{
// Double up the row
row.insert(row.end(), row.begin(), row.end());
// Now copy the row down as well
matrix.insert(matrix.end(), row);
}
但我以前的问题仍然存在!
更新2
不,最后的代码更改似乎“起作用”,至少在第一次迭代中......但是一旦我开始重新诅咒它就会崩溃...... 我已经更新了“递归”,所以它重新诅咒,我没有正确编写代码......现在我得到了输出:
HADAMARD MATRIX GENERATOR
Generating HM for index 2 - dimensions: 4x4, size: 16
before
Dimensions - rows: 1, cols: 1
1
after
Dimensions - rows: 2, cols: 2
1 1
1 1
before
Dimensions - rows: 2, cols: 2
1 1
1 1
after
Dimensions - rows: 4, cols: 4
1 1 1 1
1 1
1 1 1 1
before
Dimensions - rows: 4, cols: 4
1 1 1 1
1 1
1 1 1 1
after
Dimensions - rows: 8, cols: 8
1 1 1 1 1 1 1 1
1 1
1 1 1 1
1 1 1 1 1 1 1 1
所以,它根本不顺利! - 我认为我的载体的连接都是错的?...